http://www.lydsy.com/JudgeOnline/problem.php?id=3261

给定一个非负整数序列{a},初始长度为N。
有M个操作,有以下两种操作类型:
1、A x:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。
2、Q l r x:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。

前置技能:HDU4825

会了这个前置技能之后默认你会如何建trie跑贪心了。

参考:https://www.cnblogs.com/y7070/p/5000471.html

对于一段区间的异或和=r的前缀异或和^l-1的前缀异或和。

所以我们处理出所有前缀异或和完后往trie上插。

不过由于是区间询问,所以按照主席树(可持久化线段树)的想法,我们建立可持久化trie,具体的建立方法大致和主席树差不多,就不多讲了直接看代码吧。

至于询问,我们直接询问哪个前缀能和(n的前缀异或和^x)异或值最大即可。

直接引用参考博客:

如果 x (询问数)的这一位为 p ,那么我们查询Sum[son[l][p ^ 1]] - Sum[son[r][p ^ 1],Sum为节点上有多少的值。

如若 表达式 > 0 那么我们就像 p ^ 1 的方向行走,同时 答案加上 1 << d 因为这一位被我们错开了。

否则只好向 p 的方向行走, 不加上 1 << d。

原因请参考前置技能。

另外还要注意我们查询的内容本身就是前缀和,左端点和右端点就需要同时减一,同时查区间,那么左端点就还需要需要减一。

参考里提到了一个小技巧就是在最开始插一个0,这样就不需要左端点和右端点同时减一了,不然自己看着怪难受的。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=6e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
inline char getc(){
char ch=getchar();
while(ch!='A'&&ch!='Q')ch=getchar();
return ch;
}
struct node{
int son[],sum;
}tr[*N];
int tot,b[N],rt[N],pool;
void insert(int y,int &x,int k,int now){
tr[x=++pool]=tr[y];
tr[x].sum++;
if(now<)return;
bool p=k&(<<now);
insert(tr[y].son[p],tr[x].son[p],k,now-);
return;
}
int query(int nl,int nr,int k,int now){
if(now<)return ;
bool p=k&(<<now);
int delta=tr[tr[nr].son[p^]].sum-tr[tr[nl].son[p^]].sum;
if(delta>)return (<<now)+query(tr[nl].son[p^],tr[nr].son[p^],k,now-);
else return query(tr[nl].son[p],tr[nr].son[p],k,now-);
}
int main(){
int n=read()+,m=read();
for(int i=;i<=n;i++)b[i]=b[i-]^read();
for(int i=;i<=n;i++)insert(rt[i-],rt[i],b[i],);
for(int i=;i<=m;i++){
char ch=getc();
if(ch=='A'){
b[++n]=b[n-]^read();
insert(rt[n-],rt[n],b[n],);
}else{
int l=read(),r=read(),x=read();
printf("%d\n",query(rt[l-],rt[r],b[n]^x,));
}
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3261:最大异或和——题解的更多相关文章

  1. 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解

    https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...

  2. ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】

    题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...

  3. bzoj3261: 最大异或和 可持久化trie

    题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

  4. bzoj3261: 最大异或和 (可持久化trie树)

    题目链接 题解 看到异或和最大就应该想到01 trie树 我们记\(S_i\)为前i项的异或和 那么我们的目的是最大化\(S_n\)^\(x\)^\(S_{j-1}\) \((l <= j &l ...

  5. BZOJ3261 最大异或和 【可持久化trie树】

    题目 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

  6. bzoj3261: 最大异或和

    可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...

  7. BZOJ3261最大异或和——主席树

    题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p ...

  8. 2018.08.04 bzoj3261: 最大异或和(trie)

    传送门 简单可持久化01trie树. 实际上这东西跟可持久化线段树貌似是一个东西啊. 要维护题目给出的信息,就需要维护前缀异或和并且把它们插入一棵01trie树,然后利用贪心的思想在上面递归就行了,因 ...

  9. BZOJ5301:[CQOI2018]异或序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...

随机推荐

  1. php实现图形计算器

    存档: index.php <html> <head> <title>图形计算器开发</title> <meta http-equiv=" ...

  2. Jmeter使用JDBC链接数据库进行压力测试

    一.关于性能测试 对数据库进行压测时,我们需要关注的几个方面: 1.系统相关指标,诸如:系统CPU/内存/IO等 2.进程相关指标,诸如:mysql该数据库的对应的进程占用CPU/内存/IO等 3.数 ...

  3. 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果

      脚本结构​上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...

  4. i3wm随笔 1

    快捷键 mod+0 退出 mod+v 垂直分割 mod+h 水平风格

  5. 三、Django之请求与响应-Part 1

    一.新建项目 进入你指定的项目保存目录,然后运行下面的命令: $ django-admin startproject mysite 这将在目录下生成一个mysite目录,也就是你的这个Django项目 ...

  6. java计算两个日期之间的天数,排除节假日和周末

    如题所说,计算两个日期之前的天数,排除节假日和周末.这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天. 不够很坑的是每个日期都要查询数据库,感觉很浪费时间. 原 ...

  7. 最大公共子串:DP

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  8. AI智能外呼机器人网络拓扑结构笔记

    最近开发了一套AI智能外呼机器人系统,系统主要有3部分组成:web管理平台:呼叫机器人:SIP软交换.具体网络拓扑结构如下图: 三部分主要功能如下: 1.web管理平台:话术管理.任务管理.线路管理. ...

  9. MSCOCO - COCO API 的安装

    在 Windows 下安装 COCO API 的方法. 使用 pip 命令进行安装: pip install git+https://github.com/philferriere/cocoapi.g ...

  10. Live Archive 训练题

    7091 Height Ordering Mrs. Chambers always has her class line up in height order (shortest at the fro ...