首页 > 其他分享 >Codeforces Round 897 (Div. 2) A~E

Codeforces Round 897 (Div. 2) A~E

时间:2023-09-12 14:55:37浏览次数:36  
标签:cout 897 int void Codeforces cin num low Div

Codeforces Round 897 (Div. 2) A~E

A:
原先数组里面最小的位置放最大的数,次小的放次大的即可。

void solve(){
	int n; cin>>n;
	for(int i=1;i<=n;i++){
		int x; cin>>x;
		c[i]={x,i};
	}
	sort(c+1,c+1+n);
	int num=n;
	for(int i=1;i<=n;i++){
		ans[c[i].second]=num;num--;
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<" \n"[i==n];
	}
 }

B:
最後的结果是对称的,只需要知道一半就可以。

  • 对于长度为\(odd\)的,一旦可以成功,之后每一次都可以成功。
  • 对于长度为\(even\)的,有一次可以成功之后一定是\(0 / 1\)交错。
  • 也可以通过当前最多有几个和之前的不一样,之前有多少个地方是不对称的关系来得到结果。
void solve(){
	int n; cin>>n;
	string s;
	cin>>s;
	s="?"+s;
 
	int num=0;
	for(int i=1;i<=n/2;i++){
		if(s[i]!=s[n-i+1]) num++;
	}
 
	if(n%2==1){
		vector<int>ans;
		for(int i=1;i<=n/2+1;i++){
			if(i<=num) ans.push_back(0);
			else ans.push_back(1);
		}
		for(auto v:ans){
			cout<<v;
		}
		reverse(ans.begin(),ans.end());
		for(auto v:ans){
			cout<<v;
		}
	}
	else{
		vector<int>ans;
		for(int i=1;i<=num;i++){
			ans.push_back(0);
		}
		int flag=1;
		for(int i=num+1;i<=(n+1)/2;i++){
			ans.push_back(flag);
			flag^=1;
		}
		for(auto v:ans) cout<<v;
		cout<<flag;
		reverse(ans.begin(),ans.end());
		for(auto v:ans){
			cout<<v;
		}
	}
	cout<<"\n";
}

C:
最开始放最大的\(MEX\)即可,之后删除什么就放什么。

void solve(){
	int n;
	cin>>n;
	
	for(int i=0;i<=n;i++) vis[i]=0;
	for(int i=1;i<=n;i++){
		int x; cin>>x;
		if(x<=n) vis[x]++;
	}
	int num=-1;
	for(int i=0;i<=n;i++){
		if(vis[i]==0) {
			num=i;
			break;
		}
	}
 
	cout<<num<<endl;
	while(1){
		int x;
		cin>>x;
		if(x==-1) return ;
		else cout<<x<<endl;
	}
}

D:
从\(i\)向\(a_i\)建边,最后所有的点要么自身在一个长度为\(k\)的环里面,要目可以指向一个长度为\(k\)的环。
缩点建立新图,之后必须保证在新图里面没有出度的点的\(sz\)为k.

  • 也可以通过while循环单纯判断所有的环是不是k元。码量会小很多。
void tarjan(int x){
    dfn[x]=low[x]=++cnt;
    q.push(x);
    vis[x]=1;
	for(auto v:tr[x]){
        int y=v;
        if(dfn[y]==0){
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(vis[y]) low[x]=min(low[x],dfn[y]);
    }
    if(dfn[x]==low[x]){
        num++;
        while(1){
       	 	int t=q.top();
        	q.pop();
        	vis[t]=0;
        	col[t]=num;
        	sz[num]++;
        	if(t==x) break;
        }
    }
}
bool solve(){
	num=0;
	cin>>n>>k;
	if(k==1){
		bool ok=1;
		for(int i=1;i<=n;i++){
			int x; cin>>x;
			if(x!=i) ok=0;
		}
		return ok;
	}
	for(int i=1;i<=n;i++){
		g[i].clear();
		tr[i].clear(); du[i]=0;
		dfn[i]=low[i]=vis[i]=0;
		sz[i]=0; col[i]=0;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
		tr[i].push_back(a[i]);
		du[a[i]]++;
	}

	for(int i=1;i<=n;i++){
		if(du[i]==0) tarjan(i);
	
	for(int i=1;i<=n;i++){
		if(dfn[i]==0) tarjan(i);
	
	for(int i=1;i<=n;i++) du[i]=0;
	for(int i=1;i<=n;i++){
		for(auto v:tr[i]){
			if(col[v]==col[i]) continue;
			else g[col[i]].push_back(col[v]),du[col[i]]++;
		}
	}

	for(int i=1;i<=num;i++){
		if(sz[i]!=1 && sz[i]!=k) return 0;
	}

	for(int i=1;i<=num;i++){
		if(du[i]==0){
			if(sz[i]!=k) return 0;
		}
	}
	return 1;
}

E:
要是看到没有奇数,可能10分钟就把E1过了
在一番操作之后,最后一定只剩下\(n \%k\) 长度的没有处理出来。

  • 比如k长度为3的时候:当前处理{1,2,3}。下一次处理{2,1,4}.
    两个异或一下就知道了3^4的结果。
    通过此,可以把e1过了。
  • 假设最后剩下的一部分的长度为t.
    把t分为两部分,第一次把第一部分作为一次询问的最后面得到异或结果ans1.
    之后这一部分会被翻转到前面,然后询问\(n-k+1\),会把前一步进行了反转的非t部分和t的第二部分进行异或得到ans2。 ans1^ans2就是最后的长度为t部分的异或结果。
void solve(){
	cin>>n>>k;
	int ans=0;
	int l=1;
	while(1){
		if(l+k-1<=n){
			cout<<"? "<<l<<endl;
		}
		else{
			break;
		}
		int x; cin>>x;
		ans^=x;
		l+=k;
	}
	l--;
	int t=n-l;
	cout<<"? "<<n-k-t/2+1<<endl;
	int x; cin>>x;
	ans^=x;
	cout<<"? "<<n-k+1<<endl;
	cin>>x;
	ans^=x;
	cout<<"! "<<ans<<"\n";
	// if(l==n+1){
	// 	cout<<"! "<<ans<<endl;
	// 	return ;
	// }
	// while(1){
	// 	int p1,p2;
	// 	cout<<"? "<<l-k+1<<endl;
	// 	cin>>p1;
	// 	cout<<"? "<<l+1-k+1<<endl;
	// 	cin>>p2;
	// 	ans^=(p1^p2);
	// 	l+=2;
	// 	if(l==n+1){
	// 		cout<<"! "<<ans<<endl;
	// 		return ;
	// 	}
}
  • 注释部分就是第一个思路的代码。。

标签:cout,897,int,void,Codeforces,cin,num,low,Div
From: https://www.cnblogs.com/dhu-gxy/p/17696183.html

相关文章

  • Codeforces Round 896 (Div. 2)
    CodeforcesRound896(Div.2)A.MakeItZero代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingi128=__int128;intn,m;voidsolve(){scanf("%d",&n);vector<int>a(n+1);for(inti......
  • CodeForces 542B Duck Hunt
    洛谷传送门CF传送门首先转化一下,让鸭子不动,猎人往右移动,就相当于开的相邻两枪距离\(>m\)。设\(f_{x,i}\)为仅考虑\(r\lex\)的鸭子,上一次在\(i\)开枪,能打到的最大鸭子个数。\(f_{x-1}\tof_x\)时,首先有\(f_{x,i}=f_{x-1,i}\)。我们先找到所有\(r=x\)......
  • Codeforces Round 896 (Div. 1)
    Preface不管怎么说,最后还是被我苟上橙名了(虽然刚好2100整,不多不少)感觉我在1900~2100之间卡了好久好久,反观我的队友都是打上紫名后随便两三场就打上橙了,狠狠地羞辱我这个铁混子由于暑假集训打的校内排名比较高,作为新队伍也拿到了今年的一场CCPC+一场ICPC的名额,虽然要自费出行但......
  • Codeforces Round 101 (Div. 2) C - E
    C.Queue(思维、排序、构造、*1800)题意:$n$个人排队,为他们构造一组身高,使得$x$的前面有$a_i$个人比他高。如果无法构造满足所有条件的身高序列,输出-1。思路:首先考虑,对于$a_i$较大的人,肯定尽可能地将其往队伍后面放,然后从后往前构造,因为只有$......
  • abc288F - Integer Division
    F-IntegerDivision挺有意思的一道题,贪心的做法就是排序之后,逐个加入,如果不能被之前的表示则加入题解证明的话大概是这样考虑第i个数选不选首先加入前面选的数,如果能够表示当前的数,则必然不选否则前面的数不能表示当前的数,假如我们不选\(p_i\)假设最后得到一个合法序列,则......
  • 【题解】Educational Codeforces Round 142(CF1792)
    没有手速,再加上被E卡了,废掉了。A.GamingForces题目描述:Monocarp正在玩电脑游戏。他打算杀死\(n\)个怪兽,第\(i\)个的血量为\(h_i\)。Monocarp的角色有两个魔法咒语如下,都可以以任意顺序用任意次(可以不用),每次使用相当于一次操作。选择两个怪兽并各扣一滴血。选择......
  • Codeforces Global Round 21 B. NIT Destroys the Universe
    给一个长为\(n\)的数组,可以执行以下操作任意次:选择\(l,r(1\leql<r\leqn)\),让\(\foralli(l\leqi\leqr),a_i=mex(\{a_l,a_{l+1},\cdots,a_{r}\})\)。问最小操作数使得\(\foralli,a_i=0\)。观察:答案\(\leq2\),因为对\([1,n]\)操作不超过两次......
  • Codeforces Round 804 (Div. 2) B. Almost Ternary Matrix
    给两个偶数\(n\)和\(m\)。任务是构造任意一个二进制矩阵,\(n\timesm\)。对于任意\((i,j)\),有且仅有两个邻居的颜色与\(a_{i,j}\)不同。邻居的定义为\(|x-x'|+|y-y'|=1\)。观察:任何\(n\timesm\)的矩阵若作为一个大型矩阵的子矩阵不会受到限制。于是构造......
  • Codeforces Round 807 (Div. 2) B. Mark the Dust Sweeper
    需要打扫\(n\)个房间,第\(i\)个房间有\(a_i\)的积灰。只能使用如下魔法打扫:选择\(i,j,(1\leqi<j\leqn,\min_{k=i}^{j}a_i>0)\)。执行\(a_i=a_i-1,a_j=a_j+1\)。需要将\(1\simn-1\)号房间的积灰全部清空,最少使用多少次魔法。观察一:显......
  • Codeforces Round 811 (Div. 3) A. Everyone Loves to Sleep
    闹钟设有\(n\)个时间点,第\(i\)个时间为\((H_i,M_i)\)。在\(h,m\)时刻入睡,响铃必须起床,问能睡多久。使用\(set<pair<int,int>>\)存储闹铃时刻,然后在其中\(lower_{bound}\)到\(<first\geqh,second\geqm>\)的迭代器\(it\)。若\(it=end\),则\(it=begin......