codeforces #742 C.MEXor Mixup
作者:互联网
题目大意:
有一个未知的数组x,给定a和b。a表示数组x中不包含的最小数,b表示数组x中所有数异或的结果 。
思路:
a是x不包括的最小,所以[0,a-1]一定是在这个数组x中的 。
将这a个数异或起来可以得到一个数y。
总能找到一个数z,使得y^z==b。所以最后的答案就是a+1 。
但是,如过这个z恰好等于a,就是说a存在于数组x中,这就和a是最小不属于元素矛盾。所以需要另外找两个数u,v,使得u^v==a。所以答案变成了a+2
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 2*1e8+10;
ll f[300050] ;
ll solve(){
ll a , b , t, ans;
cin>>a>>b;
t = f[a - 1] ;//a的前缀异或(不包括a)
ans = a ;
if(t == b)return ans; //t刚好等于b就不用再加数了
if((t^a) == b)return ans + 2;//t如果要异或a才等于b就要再找两个不是a的数uv
//使得u^v=a
return ans + 1 ;//找一个非a的数
}
int main(){
ios::sync_with_stdio(false);
ll T;
cin>>T;
//要将前a个数异或起来,如果每次询问的时候去做会很浪费时间
//所以做一个前缀异或数组f,如下:
for(ll i = 1 ; i <= 300030 ; i ++){
f[i] = i ^ f[i - 1] ;
}
while(T -- ){
cout<<solve()<<"\n";
}
}
标签:742,return,MEXor,ll,int,异或,数组,ans,Mixup 来源: https://www.cnblogs.com/tyriis/p/15238214.html