1 2 3 4

CodeForces - 842D Vitya and Strange Lesson

https://codeforces.com/problemset/problem/842/D

给你个数组让你求mex(不存在的最小数字),每次异或个x,然后重新求mex。

把数组中不存在的数字放入字典树就行了。

每次摸着0往下走,除非x的那一位是1.最后的答案异或一下 x,因为刚刚从1摸下来其实相当于转了一圈。。。。

具体看图和代码把

 

 

#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 3e5+111;

int n,m;
int vis[maxn*3];
int tree[maxn*31][3];
int cnt = 0;
int list[maxn*31];

int add(int x){
    int root = 0;
    for(int i=30;i>=0;i--){
        int t = (x>>i)&1;
        if(tree[root][t] == 0) tree[root][t] = ++cnt;
        root  = tree[root][t];
    }
    list[root] = x;
    return 0;
}
int find(int cns){
    int root = 0;
    for(int i = 30;i>=0;i--){
        int t = (cns>>i)&1;
        if(tree[root][t] == 0) root = tree[root][t^1];
        else root = tree[root][t];
    }
    return list[root]^cns;
}

int main(){
    cin>>n>>m;
    int x;
    for(int i=0;i<n;i++){
        cin>>x;
        vis[x] = 1;        
    }
    for(int i=0;i<600009;i++){
        if(vis[i] == 0){
            add(i);
//            cout<<cnt<<endl;
        }
    }
    int ans = 0;
//    cout<<"ok"<<endl; 
    for(int i=0;i<m;i++){
        cin>>x;
        ans ^= x;
        cout<<find(ans)<<endl;
    }
    return 0;
}

  

posted @ 2020-10-04 19:56  Lesning  阅读(130)  评论(0编辑  收藏  举报