【链接】点击打开链接

【题意】

给出一个数组,每次操作将整个数组亦或一个数x,问得到的数组的结果中的mex.mex表示为自然数中第一个没有出现过的数。

【题解】

异或的效果是可以累加的,所以不用每次都算出来每一次的a是什么。而只要把前i个询问的x取一下异或和now,然后用异或和对每个ai异或就可以了。
对于这道题.我们需要用字典树来做.
对于一开始的a数组中没有出现的数字,都把它按照位加入到字典树中,最多19位。
原数组a,然后没出现的数字组成数组A.
结论:则我们对原数组进行一次异或操作即a xor 了x,则异或之后的a数组的mex值就是A数组也xor x之后的最小值。
感性的证明:
假设进行了一次异或操作.
则,相当于把每个数字的二进制形式中的一些1翻转成了0,而0翻转成了1,就是x的二进制中为1的那些位置都进行了翻转操作,那么假如数字t没有出现过,则进行了一次异或操作之后,t可能就出现了,而t xor x可能就没有出现了,则我们就直接认为t出现了,而t xor x变成没有出现的了.
可以这么做是因为,如果t xor x也是没有出现的话,它也会对x进行异或操作,则也会认为t是没有出现的,这样之前认为t出现过的错误结论就能得到订正,这样就不会造成错解了,t 和 t xor x还是都没出现的
而如果没有出现的数字里面没有t xor x的话,那就说明原数组里面有t xor x这个数字,则进行异或操作之后还是会有t这个数字,则之前的结论也就对了,而进行了异或操作之后 t xor x也就变成没有出现过的了
也就是说,A里面的数字,xor之后还是没有出现的.且只有这些数字是没有出现的
这样就感性地解释了那个结论.
那么现在的问题就变为,给你一个数字X,然后让你在A里面找一个数字,然后Ai和X的异或值最小.
则我们从高位开始,尽量让Ai的位和X的对应位一样(异或结果就变成0),这样高位就尽量小了。
字典树的作用就在此。

【错的次数】

1

【反思】

反面去考虑问题,从中得到结论.
二进制的问题好多和字典树有关呢。
那个结论挺难想的。

【代码】

/**/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <iomanip>
#include <set>
#include <cstdlib>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb emplace_back
#define fi first
#define se second
#define ld long double
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x)
#define rf(x) scnaf("%lf",&x)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
#define sz(x) ((int) x.size())
#define ld long doubletypedef pair<int, int> pii;
typedef pair<LL, LL> pll;//mt19937 myrand(time(0));
//int get_rand(int n){return myrand()%n + 1;}
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 19;struct node {node *ch[2];int val;node() { ch[0] = ch[1] = NULL; val = 0; }
} *root;int n, m, a[N + 10];
bool bo[1 << N];void insert(int x) {node *p = root;rep2(i, (N-1), 0) {int temp = (x >> i) & 1;if (p->ch[temp] == NULL) p->ch[temp] = new node();p = p->ch[temp];}p->val = x;
}int query(int x) {node *p = root;rep2(i, (N-1), 0) {int temp = (x >> i) & 1;if (p->ch[temp] == NULL)p = p->ch[temp ^ 1];elsep = p->ch[temp];}return p->val;
}int main() {//Open();//Close();root = new node();ri(n), ri(m);rep1(i, 1, n) {int x;ri(x);bo[x] = 1;}rep1(i, 0, (1 << N)-1) if (!bo[i])insert(i);int now = 0;rep1(i, 1, m) {int x;ri(x);now ^= x;oi(now^query(now)); puts("");}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626069.html

【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson相关推荐

  1. 【Codeforces Round #430 (Div. 2) B】Gleb And Pizza

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 根据圆心到原点的距离这个东西判断一下圆在不在那个环里面就好 [错的次数] 0 [反思] 在这了写反思 [代码] #include <cst ...

  2. 【Codeforces Round #424 (Div. 2) C】Jury Marks

    [Link]:http://codeforces.com/contest/831/problem/C [Description] 有一个人参加一个比赛; 他一开始有一个初始分数x; 有k个评委要依次对 ...

  3. 【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(二分写法)

    [题目链接]:http://codeforces.com/contest/822/problem/C [题意] 有n个旅行计划, 每个旅行计划以开始日期li,结束日期ri,以及花费金钱costi描述; ...

  4. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  5. 【Codeforces Round #299 (Div. 2) B】Tavas and SaDDas

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次取出最小的数字,在后面加上一个4或一个7就好; 会发现最后的数字很少的. [代码] #include <bits/stdc ...

  6. 【Codeforces Round #446 (Div. 2) C】Pride

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想一下,感觉最后的结果肯定是从某一段开始,这一段的gcd为1,然后向左和向右扩散的. 则枚举那一段在哪个地方. 我们设这一段中所有的 ...

  7. 【Codeforces Round #452 (Div. 2) C】 Dividing the numbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] n为偶数. l = 1, r = n (l,r)放在一组 l++,r-- 新的l,r放在另外一组 直到l+1==r 这个时候,判断两 ...

  8. 【Codeforces Round #442 (Div. 2) A】Alex and broken contest

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是所有的名字里面,只出现了其中某一个名字一次. [代码] #include <bits/stdc++.h> usin ...

  9. 【Codeforces Round #450 (Div. 2) B】Position in Fraction

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找循环节就好. ->其实可以不用找出来整个循环节. 有找到c就直接输出. 找到了循环节还没找到的话,直接输出无解. [代码] ...

最新文章

  1. 剑指offer:面试题11. 旋转数组的最小数字
  2. StackOverFlow上你没看过的7个Java最佳答案
  3. php值传递和java_Java的值传递和引用传递
  4. VTK:vtkChartMatrix用法实战
  5. 【洛谷 1969】积木大赛
  6. 搜索文献_【大牛经验分享】如何高效快捷搜索文献?
  7. 老年人学摄影,装备该如何选择?
  8. ext3日志模式---文件系统
  9. Azure Linux VM密钥登录
  10. php增加md5加密的方法_php进行md5加密简单实例方法
  11. 【CFD学习】yplus,y+,边界层理论,壁面第一层网格
  12. .mat转.tif 用于arcgis裁剪遥感图像
  13. java dead store_jcip Java并发编程实战源码,这本书名为《 践》有些抹杀了它的价值,其中 Develop 238万源代码下载- www.pudn.com...
  14. 明日之后系统互通的服务器,明日之后安卓苹果互通么?安卓苹果混服/能联机吗问题介绍[图]...
  15. Error response from daemon: removal of container XXXXXis already in progress解决方法
  16. [内存管理]内存池pool库
  17. 一定会在计算机领域取得成功英文,西子的英文考卷
  18. python中正切函数_Python tan() 函数
  19. 大学C语言期末考试题库试题及答案(1)
  20. e.preventDefault

热门文章

  1. 成功修改fastreport3.15,使其支持中日韩四(CJK)中编码PDF的导出
  2. c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)
  3. html5的新增的标签和废除的标签
  4. 归算法及经典递归例子代码实现
  5. 动态规划的用法——01背包问题
  6. 代码大全--防御试编程
  7. 汇编中的条件转移指令
  8. c_str()和strcasecmp
  9. const、static型数据在内存中如何存储?(变量存放位置)
  10. 常考数据结构和算法:设计LRU缓存结构