AtCoder Beginner Contest 381
AtCoder Beginner Contest 381 总结
https://atcoder.jp/contests/abc381
罚时吃爽了 qwq。
A
按题意模拟,判断一下即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=105;
int n;
string s;
void solve()
{
cin>>n>>s;
bool st=1;
if(n%2==0) st=0;
for(int i=1;i<=(n+1)/2-1;i++) if(s[i-1]!='1') st=0;
if(s[(n+1)/2-1]!='/') st=0;
for(int i=(n+1)/2+1;i<=n;i++) if(s[i-1]!='2') st=0;
if(st) cout<<"Yes\n";
else cout<<"No\n";
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
B
同样是按照题意判断。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=105;
int n;
string s;
map<char,int> H;
void solve()
{
cin>>s;
n=s.size();
bool st=1;
if(n%2==1) st=0;
for(int i=1;i<=n/2;i++) if(s[2*i-1]!=s[2*i-1-1]) st=0;
for(int i=0;i<n;i++) H[s[i]]++;
for(int i=0;i<n;i++) if(H[s[i]]!=2) st=0;
if(st) cout<<"Yes\n";
else cout<<"No\n";
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
C
找到所有 /
的位置,向两边拓展,左边是 1
,右边是 2
。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
string s;
map<char,int> H;
void solve()
{
cin>>n>>s;
s="0"+s;
int ans=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='/')
{
int k=0;
while(i-k-1>=1&&i+k+1<=n&&s[i-k-1]=='1'&&s[i+k+1]=='2') k++;
ans=max(ans,1+2*k);
}
}
cout<<ans<<"\n";
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
D
将数组
- 当
时,说明 不能贡献,直接将 移动到 。 - 当
时, 只能作为开头或结尾,若 没出现过,统计一次答案。然后将 移动到 ,标记 出现。 - 当
时,若 出现过,则一直移动 直到 。然后标记 出现。
移动
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N],b[N],c[N];
int v[N];
void solve()
{
cin>>n;
int tot=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=a[i-1]) b[++tot]=a[i],c[tot]=1;
else c[tot]++;
}
int j=1,ans=0;
for(int i=1;i<=tot;i++)
{
if(c[i]<2) while(j<=i) v[b[j++]]=0;
else if(c[i]>2)
{
if(!v[b[i]]) ans=max(ans,(i-j+1)*2);
while(j<i) v[b[j++]]=0;
v[b[i]]=1;
}
else
{
while(j<=i&&v[b[i]]) v[b[j++]]=0;
v[b[i]]=1;
}
if(j<=i) ans=max(ans,(i-j+1)*2);
}
cout<<ans<<'\n';
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("2.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
E
首先处理 1
,2
,/
的前缀数量,并记录所有 /
的位置,用 /
的位置。1
的数量
记录:https://atcoder.jp/contests/abc381/submissions/60088312
update:更新了两组 hack 数据,把暴力的卡掉了。
考虑优化,
- 当
时,说明答案最大,直接结束。 - 当
时,说明 增加时答案可能更大, 。 - 当
时,说明 减小时才回使答案可能更大, 。
对于每个
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,q;
string s;
int a[N],b[N],c[N];
int p[N],tot;
void solve()
{
cin>>n>>q;
cin>>s;
s="0"+s;
for(int i=1;i<=n;i++)
{
if(s[i]=='1') a[i]=1;
else if(s[i]=='2') b[i]=1;
else
{
c[i]=1;
p[++tot]=i;
}
a[i]+=a[i-1];
b[i]+=b[i-1];
c[i]+=c[i-1];
}
while(q--)
{
int l,r;
cin>>l>>r;
int L=lower_bound(p+1,p+tot+1,l)-p;
int R=upper_bound(p+1,p+tot+1,r)-p-1;
int ans=0;
int mid,c1,c2,id;
while(L<=R)
{
mid=L+R>>1;
id=p[mid];
c1=a[id-1]-a[l-1];
c2=b[r]-b[id];
ans=max(ans,2*min(c1,c2)+1);
if(c1<c2) L=mid+1;
else if(c1>c2) R=mid-1;
else break;
}
cout<<ans<<'\n';
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
F
首先
状态
设
预处理所有
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=20,S=1<<20;
int n;
int a[N],ne[N][M];
int f[S];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<M;i++) ne[n][i]=ne[n+1][i]=n+1;
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<M;j++) ne[i][j]=ne[i+1][j];
ne[i][a[i+1]-1]=i+1;
}
for(int i=0;i<S;i++) f[i]=n+1;
f[0]=0;
int ans=0;
for(int i=0;i<S;i++)
{
int cnt=0;
for(int j=0;j<M;j++)
if(i&(1<<j))
{
cnt+=2;
f[i]=min(f[i],ne[ne[f[i^(1<<j)]][j]][j]);
}
if(f[i]<=n) ans=max(ans,cnt);
}
cout<<ans<<'\n';
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}
分类:
AtCoder总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效