首页 > 其他分享 >[题解]AtCoder Beginner Contest 380(ABC380) A~F

[题解]AtCoder Beginner Contest 380(ABC380) A~F

时间:2024-11-17 19:09:14浏览次数:1  
标签:AtCoder return sta Beginner int 题解 define se cur

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\)即可。

点击查看代码
#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;
}

F - Exchange Game

注意到\(n+m+k\)一共才\(12\),果断压位暴搜。

具体来说,用一个\(3\)进制数来表示每一张牌的状态,\(0\)表示在Takahashi手里,\(1\)表示在Aoki手里,\(2\)表示在桌上。

搜索时提供该三进制数,还有当前的操作者(\(0\)是Takahashi)。先枚举取出哪张牌,再枚举拿回哪张牌(注意也可以不拿)。

如果当前状态能到达的所有状态中,存在胜者为自己的状态,则说明此状态下,自己必胜;否则(即所有状态都是对方获胜),此状态下自己必输。根节点的状态就是最终答案。

注意要记忆化。

点击查看代码
#include<bits/stdc++.h>
#define N 13
#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;
}

标签:AtCoder,return,sta,Beginner,int,题解,define,se,cur
From: https://www.cnblogs.com/Sinktank/p/18550911

相关文章

  • 【星航计划】2024.11 Div. 3 题解
    2024--星航计划--十一月份--基础算法A.分段每一段连续的\(1\)之间是独立的,我们只需要关心一段连续的1的结果。可以证明对于一段连续的\(1\),最优策略是将其划分成多个单独的\(1\)以及可能余下的连续两个\(1\)。对于\(k\)个连续的\(1\),如果\(k\)是奇数,......
  • 【学校训练记录】11月个人训练赛4个人题解
    A题意可以理解为在a,b的范围内如果一个数是某个整数的立方,求与其距离为k的范围内有几个整数的平方数,我们可以对于每个立方数求出其数量,注意边界问题#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inta,b,k;voidsolve(){ cin>>a>>b>>k; in......
  • 【未完结】 AtCoder Beginner Contest 380 题解
    AtCoderBeginnerContest380Rated:\(770\)A-123233简单模拟B-HurdleParsing字符串模拟C-MoveSegment找到第\(k\)个块的下标,模拟。D-StrangeMirroringE-1DBucketToolF-ExchangeGameG-AnotherShuffleWindow......
  • 【AtCoder】Beginner Contest 378-E.Mod Sigma Problem
    题目链接ProblemStatementYouaregivenasequenceA=(A1......
  • 【AtCoder】Beginner Contest 378-F.Add One Edge 2
    [题目链接](F-AddOneEdge2(atcoder.jp))ProblemStatementYouaregivenatreewithNNNvertices.Thei......
  • CF603E Pastoral Oddities 题解
    Description给定一张\(n\)个点的无向图,初始没有边。依次加入\(m\)条带权的边,每次加入后询问是否存在一个边集,满足每个点的度数均为奇数。若存在,则还需要最小化边集中的最大边权。\(n\le10^5\),\(m\le3\times10^5\)。Solution考虑给定一个图,怎么判断这个图存在一个......
  • AtCoder Beginner Contest 380 A - E
    link赛时是ABC,D一眼要找规律,跳了,E题思路想了接近半个小时,然后发现假了,最后没调出来,问一下dalao发现其实很简单维护。。。基础线段树没切掉,哎呦不过发现比赛打多了,理解速度和手速都有些提高,幸好前三题秒掉了,要不然rating又会是一坨A-123233B-HurdleParsingC-M......
  • AtCoder Beginner Contest 380
    省流版A.计数判断即可B.计数统计即可C.模拟即可D.注意到字符串是左右大小写镜像,从长度大往小依次考虑实际所处的位置,维护镜像次数集合E.并查集维护连通性,并尝试与左右俩格子合并即可F.博弈\(dp\),状态数只有\(5e5\),直接记忆化搜索即可G.枚举打乱起始位置,全排列分......
  • Atcoder 11.17
    这是11.17号的题单4.第四题是字符串的问题,只需要找到规律即可,对于每个查询k[i],首先计算a和aa:a是(k[i]-1)//ls,即k[i]-1除以字符串长度ls的商。这相当于确定k[i]在重复字符串中属于第几个完整的字符串块。aa是bin(a).count("1")%2,即a的二进制表示中"1"......
  • 2021 Hubei Provincial Collegiate Programming Contest/2021湖北省赛 题解
    按解决顺序排列目录FAIDHECKJGBF二分答案ans,放最小的前ans个bi(变成必须放完)因为bi=2^k,所以小的放了可能会拆散大的空间,大的把小的地方占了的话小的可以塞其他地方,所以先放大的然后暴力能放则放,最多log次指针回到开头所以一次求解O(nlogn),总复杂度log^2A模拟,暴力枚举暴力异......