其他分享
首页 > 其他分享> > codeforces #742 C.MEXor Mixup

codeforces #742 C.MEXor Mixup

作者:互联网

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