[关闭]
@exut 2024-10-15T01:27:35.000000Z 字数 991 阅读 162

刷luogu2018号题单记录

codeforces 刷题


就当锻炼思维罢

CF1304C

初始区间设为 ,即 ,然后每过一个时间间隔 ,变成 ,然后再和当前需求区间 取交,如果交到最后 就不行,不然就行呗

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int q,n,m,t[105],l[105],r[105];
  4. int main(){
  5. cin>>q;
  6. while(q--){
  7. cin>>n>>m;
  8. int L,R;L=R=m;
  9. for(int i=1;i<=n;i++) cin>>t[i]>>l[i]>>r[i];
  10. bool flg=1;
  11. for(int i=1;i<=n;i++){
  12. int d=t[i]-t[i-1];
  13. L-=d,R+=d;
  14. L=max(L,l[i]);
  15. R=min(R,r[i]);
  16. if(L>R){flg=0;break;}
  17. }
  18. cout<<(flg?"YES\n":"NO\n");
  19. }
  20. }

CF1385D

这个 真的是个非常大的提示了,遂考虑分治。

表示把子串 变成 好串的代价。

为了维护这个信息,我们还需要知道

分治递归求解即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int t;
  4. int n;
  5. char s[200005];
  6. int a[200005];
  7. int div(int l,int r,int c){
  8. if(l==r){
  9. return a[l]!=c;
  10. }
  11. int mid=(l+r)>>1;
  12. int tot1,tot2;
  13. tot1=tot2=0;
  14. for(int i=l;i<=mid;i++){
  15. tot1+=(a[i]!=c);
  16. }
  17. for(int i=mid+1;i<=r;i++){
  18. tot2+=(a[i]!=c);
  19. }
  20. return min(tot1+div(mid+1,r,c+1),tot2+div(l,mid,c+1));
  21. }
  22. int main(){
  23. cin>>t;
  24. while(t--){
  25. cin>>n;cin>>(s+1);
  26. for(int i=1;i<=n;i++){
  27. a[i]=s[i]-'a'+1;
  28. }
  29. cout<<div(1,n,1)<<"\n";
  30. }
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注