专栏文章

题解:CF288C Polo the Penguin and XOR operation

CF288C题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio3umop
此快照首次捕获于
2025/12/02 12:55
3 个月前
此快照最后确认于
2025/12/02 12:55
3 个月前
查看原文

思路:

有点小暴力,从大到小循环每个数 ii,求出他和 11nn 中的数的最大异或结果。再加上异或结果,把两个数打上标记就可以了。

代码:

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int x[1000005];
main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=0; i<=n; i++) x[i]=-1;
	int ans=0;
	int lft=n+1;//剩余几个节点 
	for(int i=n; i>=0; i--) {
		if(x[i]!=-1) continue;
		if((n+1)%2==1&&lft==1){
			x[i]=i;
//			cout<<i<<' '<<x[i]<<'\n';
			break;
		}
		int sl=log2(i)+1;
		int j=i^(int)(pow(2,sl)-1);
		ans+=(i^j)*2;
		x[j]=i;
		x[i]=j;
//		cout<<i<<' '<<j<<'\n';
		lft-=2;
//		cout<<i<<' '<<lft<<'\n';
	}
	cout<<ans<<'\n';
	for(int i=0;i<=n;i++) cout<<x[i]<<' ';
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...