codeforces #742 C.MEXor Mixup
阿新 • • 發佈:2021-09-07
題目大意:
有一個未知的陣列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"; } }