Codeforces Round 972 (Div. 2) 补题记录(A~C,E1)
dp round again
A
发现构造若干个
void solve(unsigned __testid=1){
int n;
cin>>n;
F(i,0,4){
int cnt=n/5;
if(n%5>i)++cnt;
F(j,1,cnt){
if(i==1)putchar('e');
if(i==2)putchar('i');
if(i==3)putchar('o');
if(i==4)putchar('u');
if(!i)putchar('a');
}
}
cout<<'\n';
}
B1
分类讨论
void solve(unsigned __testid=1){
int n,m,q;cin>>n>>m>>q;
int b1,b2;cin>>b1>>b2;int c;cin>>c;
if(b1>b2)swap(b1,b2);
if(b1<=c&&c<=b2)cout<<(b2-b1)/2<<'\n';
else if(c<b1)cout<<b1-1<<'\n';
else cout<<n-b2<<'\n';
}
B2
在 B1 的基础上加一个二分求出
int a[N],b[N];
void solve(unsigned __testid=1){
int n,m,q;cin>>n>>m>>q;
F(i,1,m)cin>>b[i];
sort(b+1,b+m+1);
F(i,1,q){
int x;cin>>x;
int l=1,r=m,best=-1;
if(x<b[1])cout<<b[1]-1<<'\n';
else if(x>b[m])cout<<n-b[m]<<'\n';
else{
while(l<=r){
int mid=l+r>>1;
if(b[mid]>=x)best=mid,r=mid-1;
else l=mid+1;
}
assert(~best);
// best-1 ~ best
cout<<(b[best]-b[best-1])/2<<'\n';
}
}
}
C
咚咚咚
一个十分复杂的做法。
设
首先可以发现字符串
然后进入 dp。首先设
然后考虑做转移方程。
对于每一个字符串
- 考虑
,此时可以直接从这个字符串打头,此时这个字符串对答案的贡献为 。 - 枚举上一个被选择的字符串
,此时对答案的贡献为:- 若
在 的基础上开辟了一个新的循环,那么:- 若
,则此时 最后一个循环已经被匹配,因此对答案的贡献为 。 - 若
,则此时 最后一个循环没有被匹配,计算该循环剩下的未匹配字符数量 ,其就是对答案的贡献。
- 若
- 否则,因为还在上一个循环里所以对答案没有贡献。
- 计算
所属完整循环节数量 也是对答案的贡献。 - 剩下的
即为下一个循环但是没有被 字符串所完全覆盖的长度,对答案的贡献为 。
- 若
最后的答案即为
考虑依据上述转移方程暴力转移,时间复杂度为
void solve(unsigned __testid=1){
// freopen(".out","w",stdout);
int n,k;cin>>n>>k;
F(i,1,n)cin>>s[i];
F(i,1,n){
string t;
for(auto &j:s[i])
if(j=='n'||j=='a'||j=='r'||j=='e'||j=='k')
t+=j;
s[i]=t;
}
F(i,1,n){
len[i]=s[i].size();
s[i]=' '+s[i];
}
F(i,1,n)
F(j,0,4)
f[i][j]=-1e18;
int mx=0;
f[0][4]=0;
F(i,1,n){
char sp[]={'n','a','r','e','k'};
F(j,0,4){
int cnt=0,all=0;
int now=j;
F(k,1,len[i]){
if(s[i][k]==sp[now]){
now=(now+1)%5;
++cnt;
}else ++all;
}
if(!cnt)continue;
// cout<<"i=" <<i<<" then j can be "<<j<<", "<<cnt<<' '<<all<<'\n';
int pre=now-1;
if(pre<0)pre+=5;
now=pre;
pre=j-1;
if(pre<0)pre+=5;
if(pre==4)f[i][now]=max({cnt/5*5-all-cnt%5,f[i][now]});
F(k,1,i-1){
int cost=f[k][pre];
int cntt=cnt;
if(cnt<4-pre)cost-=cnt+all;
else{
if(pre!=4){
cnt-=(4-pre);
cost+=5-all;
cost+=pre+1;
}else cost-=all;
cost+=cnt/5*5;
cost-=cnt%5;
}
cnt=cntt;
// cout<<"WORI "<<k<<' '<<cnt<<' '<<cost<<' '<<now<<' '<<pre<<' '<<f[k][pre]<<" COMPARE "<<(cnt<4-pre)<<'\n';
f[i][now]=max(f[i][now],cost);
}
}
F(j,0,4)mx=max(mx,f[i][j]);
// cout<<"qwq "<<i<<' ';
// F(j,0,4)cout<<f[i][j]<<' ';
// cout<<'\n';
}
cout<<mx<<'\n';
}
D
咕咕咕。
E1
一个很 trival 的思路是设
那么考虑枚举
时间复杂度为
比 C 简单不知道多少。
int f[310][310][310],b[310][310],a[310310];
void solve(unsigned __testid=1){
int l,n,m;cin>>l>>n>>m;
F(i,1,l)cin>>a[i];
F(i,1,n)F(j,1,m)cin>>b[i][j];
F(i,0,l+1)F(j,0,n+1)F(k,0,m+1)f[i][j][k]=0;
G(i,l,1)G(j,n,1)G(k,m,1){
if(a[i]==b[j][k])f[i][j][k]|=!f[i+1][j+1][k+1];
f[i][j][k]=f[i][j][k]+f[i][j+1][k]+f[i][j][k+1]-f[i][j+1][k+1];
}
if(f[1][1][1])cout<<"T\n";
else cout<<"N\n";
}
E2
咕咕咕。
本文来自博客园,作者:yhbqwq,转载请注明原文链接:https://www.cnblogs.com/yhbqwq/p/18416709,谢谢QwQ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)