P10558 [ICPC 2024 Xi’an I] XOR Game
题目描述
Alice 和 Bob 正在进行一场游戏。
在他们面前有一个多重集 {ai}\{a_i\}{ai},其中包含非负整数,还有一个整数 xxx。在游戏开始前,aaa 中的每个数字都是 000 或 2i(0≤i<k)2^i(0\le i<k)2i(0≤i<k)。
这是一场回合制游戏,Alice 先开始。在一个人的回合中,他或她将从 aaa 中选择一个整数。设这个数为 ppp。然后这个人可以选择是否执行 x←x⊕px\gets x\oplus px←x⊕p,接着从 aaa 中移除 ppp。这里,操作 ⊕\oplus⊕ 表示按位异或。
Alice 想让 xxx 尽可能大,而 Bob 想让 xxx 尽可能小。
你是一个旁观者,想知道最终的 xxx 值。然而,aaa 的大小是一个巨大的数字。形式上,对于所有 0≤i<k0\le i<k0≤i<k,有 bib_ibi 个数在 aaa 中的值为 2i2^i2i,并且有 zzz 个数的值为 000。但你仍然想挑战这个不可能的问题。
如果 Alice 和 Bob 足够聪明,请输出最终的 xxx 值。
输入格式
第一行包含两个整数 k,z(1≤k≤105,0≤z≤109)k,z(1\le k\le10^5,0\le z\le 10^9)k,z(1≤k≤105,0≤z≤109)。
下一行包含 kkk 个整数,第 iii 个整数是 bi−1(0≤bi−1≤109)b_{i-1}(0\le b_{i-1}\le10^9)bi−1(0≤bi−1≤109)。
输出格式
以二进制格式输出答案。注意,即使这个数字有前导 000,你也应该从高位到低位输出恰好 kkk 位。
输入输出样例 #1
输入 #1
1 0
3
输出 #1
1
输入输出样例 #2
输入 #2
2 0
2 1
输出 #2
11
输入输出样例 #3
输入 #3
2 0
2 2
输出 #3
00
说明/提示
(由 ChatGPT 4o 翻译)
C++实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int k,z,f,use;
int b[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>k>>z;
f=z&1;
for(int i=1;i<=k;i++){
cin>>b[i];
if(b[i]&1) f^=1;
}
if(f){
for(int i=k;i>0;i--){
if(b[i]==0) cout<<0;
else if(b[i]==1){
use^=1;
cout<<use;
}
else cout<<1;
}
}
else{
for(int i=k;i>0;i--){
if(b[i]==1){
use^=1;
cout<<use;
}
else cout<<0;
}
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P10558 ICPC 2024 Xi‘an I XOR Game&spm=1001.2101.3001.5002&articleId=163148197&d=1&t=3&u=7bb0fb32bf184d7882edb28767c69423)
322

被折叠的 条评论
为什么被折叠?



