hyc的xor/mex

描述

NOIP2017就要来了,备战太累,不如做做hyc的新题?

找回自信吧!

一句话题意:n个数,m个操作

操作具体来讲分两步

1.读入x,把n个数全部xor上x

2.询问当前n个数的mex

意味着每次操作后你都需要输出一次

(注意:是mex,即集合内未出现过的最小非负整数

举2个例子 mex(4,33,0,1,1,5)=2 mex(1,2,3)=0)

输入

第一行两个整数n,m 意义同题面(1 ≤ n, m ≤ 3 * 10^5)

第二行 n个数 ai (0 ≤ ai ≤ 3 * 10^5)

接下来 m 行

每行一个整数 x

表示将所有数xor上x (0 ≤ x ≤ 3 * 10^5).

输出

一共m行

每行表示当前n个数的xor

样例输入

5 4

0 1 5 6 7

1

1

4

5

样例输出

2

2

0

2

提示

30%数据n,m<=1000

100%数据同“输入”

标签

mogician原创

假想有一个01trie,立刻想到对所有数进行异或操作就相当于对有1的二进制位层上的所有节点进行reverse操作,然而这个东西是可以用数组模拟的,于是就只差查询操作了,这个东西直接二进制位贪心查一查就行了。

于是我也分不清楚我写的是01trie还是权值线段树了。

代码:

#include<bits/stdc++.h>
#define N 300005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define inf ((1<<19)-1)
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline void write(int x){
    if(x>9)write(x/10);
    putchar(x%10^48);
}
int n,m,s[20];
struct Node{int l,r,cnt;}T[N<<2];
inline void pushup(int p){T[p].cnt=T[lc].cnt+T[rc].cnt;}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r;
    if(l==r){T[p].cnt=0;return;}
    build(lc,l,mid),build(rc,mid+1,r);
}
inline void update(int p,int k){
    if(T[p].l==T[p].r){T[p].cnt=1;return;}
    update(p<<1|(k>mid),k),pushup(p);
}
inline int query(int p,int dep){
    if(T[p].l==T[p].r)return 0;
    int tmp=p<<1|s[dep];
    if(T[tmp].cnt==T[tmp].r-T[tmp].l+1)return query(tmp^1,dep-1)+(1<<dep);
    return query(tmp,dep-1);
}
int main(){
    n=read(),m=read();
    build(1,0,inf);
    while(n--)update(1,read());
    while(m--){
        int x=read();
        for(int j=1;j<=19;++j)if(x&(1<<j))s[j]^=1;
        write(query(1,18)),putchar('\n');
    }
    return 0;
}

2018.08.22 hyc的xor/mex(线段树/01trie)的更多相关文章

  1. 2018.08.22 NOIP模拟 or(线段树)

    or [描述] 构造一个长度为 n 的非负整数序列 x,满足 m 个条件,第 i 个条件为x[li] | x[li+1] | - | x[ri]=pi. [输入] 第一行两个整数 n,m.接下来 m ...

  2. 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)

    传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...

  3. 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)

    传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...

  4. 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)

    2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ...

  5. 2018.07.08 hdu1394 Minimum Inversion Number(线段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

  6. HDU-4747 Mex 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:求一个数列中,所有mex(L,R)的和. 注意到mex是单调不降的,那么首先预处理出mex ...

  7. [置顶] hdu4747 Mex 线段树

    题意:给你一个序列,让你求出对于所有区间<i, j>的mex和,mex表示该区间没有出现过的最小的整数. 思路:从时限和点数就可以看出是线段树,并且我们可以枚举左端点i, 然后求出所有左端 ...

  8. BZOJ.3585.mex(线段树)

    题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么 ...

  9. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

随机推荐

  1. js倒计时发送验证码按钮

    var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value=&q ...

  2. EXCEL 数组公式

    数组里的元素,同一行内的各元素用英文逗号“,”分开,用英文分号“;”将各行分开 3.单列数组与单行数组的计算 两个数组相加,查看结果是几行几列:在任意单元格输入公式“=A80:A83+B87:E87” ...

  3. for 命令详解

    FOR有4个参数 /d   /l   /r   /f   他们的作用我在下面用例子解释 FOR /L %%variable IN (start,step,end) DO command [comman ...

  4. 机器学习入门-DBSCAN聚类算法

    DBSCAN 聚类算法又称为密度聚类,是一种不断发张下线而不断扩张的算法,主要的参数是半径r和k值 DBSCAN的几个概念: 核心对象:某个点的密度达到算法设定的阈值则其为核心点,核心点的意思就是一个 ...

  5. Spring boot 配置文件 使用占位符号

    配置文件占位符 1:使用随机数 ${random.value}.${random.int}.${random.long} ${random.)}.${random.,]} 2: 占位符获取之前配置的值 ...

  6. HTTPS 路径配置

    1: 首先安装 fiddlercertmaker.exe 文件   2:Tools  -> HTTPS    3: Connections 勾中Allow remote computer to ...

  7. 6 python 继承与派生

    1.什么是继承? 继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类 父类又可以 ...

  8. python, Django 的安装

    yum install zlib yum install zlib-devel yum install openssl-devel 否则导致安装setuptools出错,还需要重新编译python 如 ...

  9. jstl fmt

    1)导入jstl 包,加载ftm标签 首先将jstl的jar包放入类库中,使用1.2版本 其次在jsp文件中引入所需要的 标记库,对于 ftm 标签,如下: <%@ taglib prefix= ...

  10. Tensorflow从文件读取数据

    http://blog.csdn.net/zengxyuyu/article/details/53289906