A
被这题卡住了,没写出来,想着类似AC自动机了,发现讨论一堆还可能有错。实质上就是每个位置枚举即可。

#include<bits/stdc++.h> using namespace std; typedef long long ll; const string str="abacaba"; int n; string s; bool check(string &a) { int cnt=0; for(int i=0;i+7<=n;i++)if(a.substr(i,7)==str)cnt++; return cnt==1; } int main() { int T;scanf("%d",&T); while(T--) { cin>>n>>s; bool has=0; for(int i=0;i+7<=n;i++) { string ss=s; bool ok=1; for(int j=0;j<7;j++) { if(ss[i+j]!=str[j]&&ss[i+j]!='?'){ok=0;break;} ss[i+j]=str[j]; } if(ok&&check(ss)) { for(int j=0;j<n;j++)if(ss[j]=='?')ss[j]='d'; puts("Yes"),cout<<ss<<endl,has=1; break; } } if(!has)puts("No"); } }
B
枚举a,判断m被a除的余数看是否符合条件即可

#include<bits/stdc++.h> using namespace std; typedef long long ll; int T,l,r; ll m; int main() { cin>>T; while(T--) { cin>>l>>r>>m; int A,B,C; for(int a=l;a<=r;a++) { int rest=m%a; if(l+rest<=r&&m/a){A=a,C=l,B=l+rest;break;} rest=a-rest; if(l+rest<=r){A=a,B=l,C=l+rest;break;} } cout<<A<<' '<<B<<' '<<C<<endl; } }
C
发现至多只有一种花买的数量>2,将花按a排序,二分+枚举即可

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+7; int n,m; ll ans,sum,s[N]; struct node{int a,b;}a[N]; bool cmp(node a,node b){return a.a==b.a?a.b>b.b:a.a>b.a;} int main() { int T;scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d%d",&a[i].a,&a[i].b); sort(a+1,a+m+1,cmp); if(n==1){printf("%d ",a[1].a);continue;} ans=0; for(int i=1;i<=m;i++)s[i]=s[i-1]+a[i].a; for(int i=1;i<=m;i++) { if(i<=n&&n<=m&&a[n].a>=a[i].b)ans=max(ans,s[n]); else if(i>n&&a[n-1].a>=a[i].b)ans=max(ans,s[n-1]+a[i].a); else if(a[i].b>=a[1].a)ans=max(ans,a[i].a+1ll*(n-1)*a[i].b); else if(a[i].b<=a[m].a)ans=max(ans,s[m]+1ll*(n-m)*a[i].b); else{ int l=1,r=m,mid; while(l<=r) { mid=l+r>>1; if(a[mid].a>a[i].b)l=mid+1; else r=mid-1; } if(i<=r)ans=max(ans,s[r]+1ll*(n-r)*a[i].b); else ans=max(ans,s[r]+a[i].a+1ll*(n-r-1)*a[i].b); } } printf("%lld ",ans); } }
D
这题就是two-pointers,由于长时间不写题码不出来,于是本场就做出来2题成功垫底,但最终还是订正完了

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; struct node{int id;ll x;}a[N]; deque<int>q; int n; bool operator<(node a,node b){return a.x<b.x;} int main() { ll m,k; scanf("%d%*d%lld%lld",&n,&m,&k),m/=2; for(int i=1;i<=n;i++)scanf("%*d%lld",&a[i].x),a[i].id=i,a[i].x%=m; sort(a+1,a+n+1); for(int i=1;i<=n;i++)a[i+n]=a[i],a[i+n].x+=m; int l=2,del=n,sz=0,st=0,al=0; for(int i=1;i<=n;i++) { if(q.size()&&q.front()==a[i].id)q.pop_front(),sz--; l=max(l,i+1); while(a[l].x<=a[i].x+k-1)q.push_back(a[l++].id),sz++; if(sz<del) { if(q.size())al=i+1; del=sz,st=(a[i].x+k)%m; } } printf("%d %d ",del,st); if(del)for(int i=al;i<al+del;i++)printf("%d ",a[i].id); }
rank460 rating+=513