[题解]AtCoder Beginner Contest 380(ABC380) A~F
A - 123233
照题意统计即可。
点击查看代码
#include<bits/stdc++.h> using namespace std; string s; map<char,int> ma; signed main(){ cin>>s; for(char i:s) ma[i]++; if(ma['1']==1&&ma['2']==2&&ma['3']==3) cout<<"Yes\n"; else cout<<"No\n"; return 0; }
B - Hurdle Parsing
还是照题意模拟即可。
点击查看代码
#include<bits/stdc++.h> using namespace std; string s; signed main(){ cin>>s; int cnt=0; for(int i:s){ if(i=='|'){ if(cnt) cout<<cnt<<" "; cnt=0; }else if(i=='-') cnt++; } return 0; }
C - Move Segment
就是将第\(k\)个1
的连通块移到紧贴第\(k-1\)个1
的连通块后面。
照题意模拟即可(代码过于不可读,不建议参考)。
点击查看代码
#include<bits/stdc++.h> #define N 500010 using namespace std; int n,k; string s,t; int ll[N],rr[N],idx; int p[N]; signed main(){ cin>>n>>k>>s; s=' '+s+' '; int l,r; for(int i=1;i<=n;i++){ if(s[i]!=s[i-1]&&s[i]=='1') l=i; if(s[i]!=s[i+1]&&s[i]=='1'){ r=i; ll[++idx]=l,rr[idx]=r; } } int cha=ll[k]-rr[k-1]; ll[k]=ll[k]-cha+1; rr[k]=rr[k]-cha+1; for(int i=1;i<=idx;i++){ p[ll[i]]++,p[rr[i]+1]--; } for(int i=1;i<=n;i++){ p[i]+=p[i-1]; cout<<p[i]; } return 0; }
D - Strange Mirroring
将字符串\(s\)反转得到\(s'\),拼接起来是\(s\ s'\ s'\ s\ \dots\)。将每个串依次编号为\(0,1,2,3,\dots\),通过手玩可以发现第\(x\)个串为\(s\),当且仅当\(\text{popcount}(x)=0\),其中\(\text{popcount}(x)\)是指\(x\)的二进制中\(1\)出现的次数。
还是直接模拟就可以。
点击查看代码
#include<bits/stdc++.h> #define int long long #define Q 200010 using namespace std; string s; int q,k,n; char ch(char a){ if(a>='A'&&a<='Z') return a-'A'+'a'; return a-'a'+'A'; } signed main(){ cin>>s>>q; n=s.size(); for(int i=1;i<=q;i++){ cin>>k; k--; int round=k/n; k%=n; if(__builtin_popcountll(round)&1) cout<<ch(s[k]);//changed else cout<<s[k]; cout<<" "; } return 0; }
E - 1D Bucket Tool
当时在机房所以没装插件,用的百度翻译,然后就理解错题意了,以为操作\(2\)要求输出\(x\)所在位置的颜色出现了多少次,然后……寄了( ̄  ̄|||)
用map
来维护颜色相同的区间。
对于询问\(1\),用lower_bound()
找到该元素在set
中的哪个区间,然后将该区间删掉,再添加进去修改过颜色的区间即可。
注意如果相邻的区间颜色和该区间修改后的颜色相同,需要把相邻的区间也删掉,合并进新添加的区间。为了防止一系列边界问题,我们在头尾各加\(2\)个哨兵,颜色设为\(-1\)即可。时间复杂度\(O((n+q)\log n)\)。
upd 2024/11/18:将结构体Range
的成员前添加mutable
关键字,就可以突破set
的const
函数限制,直接修改成员,这样就不需要删除再添加了。
点击查看代码
#include<bits/stdc++.h> #define N 500010 #define Q 200010 using namespace std; struct Range{int l,r,color;}; class cmpclass{ public: bool operator()(const Range& a,const Range& b) const{ return a.r<b.r;//按右端点从小到大 } }; set<Range,cmpclass> se; int n,q,cnt[N]; signed main(){ cin>>n>>q; se.insert({0,0,-1}); se.insert({n+1,n+1,-1}); for(int i=1;i<=n;i++) se.insert({i,i,i}),cnt[i]=1; while(q--){ int op,x,c; cin>>op; if(op==1){ cin>>x>>c; auto it=se.lower_bound({x,x,x}); int l=it->l,r=it->r,color=it->color; cnt[c]+=(r-l+1); cnt[color]-=(r-l+1); it=se.erase(it); if(it->color==c){ r=it->r; it=se.erase(it); } it--; if(it->color==c){ l=it->l; it=se.erase(it); } se.insert({l,r,c}); }else{ cin>>x; cout<<cnt[x]<<"\n"; } } return 0; }
其实……直接用并查集就好,这样子时间复杂度是\(O(n+q\alpha(n))\)。
F - Exchange Game
注意到\(n+m+k\)一共才\(12\),果断压位暴搜。
具体来说,用一个\(3\)进制数来表示每一张牌的状态,\(0\)表示在Takahashi
手里,\(1\)表示在Aoki
手里,\(2\)表示在桌上。
搜索时提供该三进制数,还有当前的操作者(\(0\)是Takahashi
)。先枚举取出哪张牌,再枚举拿回哪张牌(注意也可以不拿)。
如果当前状态能到达的所有状态中,存在胜者为自己的状态,则说明此状态下,自己必胜;否则(即所有状态都是对方获胜),此状态下自己必输。根节点的状态就是最终答案。
注意要记忆化。时间复杂度\(O(3^N\times N^2)\),其中\(N=n+m+k\)。
点击查看代码
#include<bits/stdc++.h> #define N 12 #define int long long using namespace std; int n,m,l,nn,a[N],pow3[N],f[2][531441];//3^11=531441 struct Status{ int v=0; int get(int pos){return v/pow3[pos]%3;} Status chp(int pos,int vv){return {v+(vv-get(pos))*pow3[pos]};} }; bool dfs(bool cur,Status sta){ if(f[cur][sta.v]!=-1) return f[cur][sta.v]; for(int i=0;i<nn;i++){//打出的牌 if(sta.get(i)!=cur) continue; for(int j=0;j<nn;j++){//取回的牌 if(sta.get(j)!=2||a[j]>=a[i]) continue; if(dfs(cur^1,sta.chp(i,2).chp(j,cur))==cur) return (f[cur][sta.v]=cur); } if(dfs(cur^1,sta.chp(i,2))==cur) return (f[cur][sta.v]=cur); } return (f[cur][sta.v]=cur^1); } signed main(){ memset(f,-1,sizeof f); pow3[0]=1; for(int i=1;i<N;i++) pow3[i]=pow3[i-1]*3; cin>>n>>m>>l; nn=n+m+l; for(int i=0;i<nn;i++) cin>>a[i]; Status sta; for(int i=0;i<nn;i++) sta=sta.chp(i,(i>=n)+(i>=n+m)); cout<<(dfs(0,sta)?"Aoki\n":"Takahashi\n"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-11-17 [笔记]Kruskal和Prim算法的比较