P4735 最大异或和

题目描述

给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。

有\(M\)个操作,有以下两种操作类型:

  1. A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N+1\)。
  2. Q l r x:询问操作,你需要找到一个位置\(p\),满足\(l \le p \le r\),使得: \(a[p] \oplus a[p+1] \oplus \cdots \oplus a[N] \oplus x\)最大,输出最大是多少。

输入输出格式

输入格式:

第一行包含两个整数 \(N,M\),含义如问题描述所示。

第二行包含 \(N\)个非负整数,表示初始的序列\(A\) 。

接下来\(M\)行,每行描述一个操作,格式如题面所述。

输出格式:

假设询问操作有 \(T\) 个,则输出应该有 \(T\) 行,每行一个整数表示询问的答案。

说明

对于测试点 \(1-2\),\(N,M \le 5\)。

对于测试点 \(3-7\),\(N,M \le 80000\)。

对于测试点 \(8-10\),\(N,M \le 300000\)。

其中测试点 \(1, 3, 5, 7, 9\)保证没有修改操作。

\(0 \le a[i] \le 10^7\)。


不知道为什么觉得这玩意儿挺可爱。

可持久化字典树,思想上和可持久化的所有东西都差不多,每次加入修改的一部分副本,剩下的用之前的。

大致流程是,和前一个点一起带进去,安排自己的儿子,然后把前一个点的儿子拿过来用。

对于这个题目,由异或的性质可以等价于求

\(s[p] \oplus s[n] \oplus x\)的最大值,其中\(s[i]\)表示异或前缀和,然后后面两个是一个可以得到的值,我们只需要在一个区间的数中找到一个数与它异或起来最大就可以了。

如果我们可以在那个区间的字典树上找相反的点,就可以得到最大值了。

于是把可持久化字典树建出来,查询\(r-1\)之前的字典树,为了不查到\(l-1\)之前的,对字典树每个节点维护一下这棵子树的编号最大的末尾节点。

注意细节,要先建一个0为根的树


Code:

#include <cstdio>
#include <cctype>
const int N=6e5+10;
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
return x;
}
int n,m,s[N],mx[N*24],ch[N*24][2],root[N],tot;char op[3];
int max(int x,int y){return x>y?x:y;}
#define ls ch[now][0]
#define rs ch[now][1]
void Insert(int las,int &now,int dep,int id)
{
if(!now) now=++tot;
if(!(~dep)) {mx[now]=id;return;}
Insert(ch[las][s[id]>>dep&1],ch[now][s[id]>>dep&1],dep-1,id);
if(!ls)ls=ch[las][0];if(!rs)rs=ch[las][1];
mx[now]=max(mx[ls],mx[rs]);
}
int query(int now,int les,int x,int dep)
{
if(!(~dep)) return x^s[mx[now]];
int bit=x>>dep&1;
if(mx[ch[now][bit^1]]>=les)
return query(ch[now][bit^1],les,x,dep-1);
else
return query(ch[now][bit],les,x,dep-1);
}
#define rep(i,a,b) for(int i=a;i<=b;i++)
int main()
{
scanf("%d%d",&n,&m);
mx[0]=-1;
Insert(0,root[0],23,0);
rep(i,1,n)
s[i]=s[i-1]^read(),Insert(root[i-1],root[i],23,i);
rep(i,1,m)
{
scanf("%s",op);
if(op[0]=='A')
{
++n,s[n]=s[n-1]^read();
Insert(root[n-1],root[n],23,n);
}
else
{
int l=read(),r=read();
printf("%d\n",query(root[r-1],l-1,s[n]^read(),23));
}
}
return 0;
}

2018.11.2

洛谷 P4735 最大异或和 解题报告的更多相关文章

  1. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  2. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  3. 【题解】洛谷P4735最大异或和

    学习了一下可持久化trie的有关姿势~其实还挺好理解的,代码也短小精悍.重点在于查询某个历史版本的trie树上的某条边是否存在,同样我们转化到维护前缀和来实现.同可持久化线段树一样,我们为了节省空间继 ...

  4. [洛谷P4735]最大异或和

    题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...

  5. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  6. 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告

    P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...

  7. 洛谷 P1972 [SDOI2009]HH的项链 解题报告

    P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...

  8. 洛谷 P4585 [FJOI2015]火星商店问题 解题报告

    P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...

  9. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

随机推荐

  1. HTTP与IIS知识点

    HTTP TCP/IP 使用的网络是在TCP/IP协议族的基础上运作的.HTTP属于它内部的一个子集. 协议:计算机与设备要互相通信,双方就必须基于相同的方法.这种规则称为协议(protocol) 分 ...

  2. sqlserver 循环赋值变量

    sql server 是可以用 @变量 +=值的: 第一:必须在循环里面, 第二: 必须在循环外面初始化变量的值 如:  @变量=''; 这样才能循环给值

  3. Spring全局变量

    压测spring框架的webservice接口,大并发量下响应值与预期值不一致 经查,开发在类中使用全局变量导致: springmvc核心控制器DispatcherServlet 默认为每个contr ...

  4. Linux命令应用大词典-第33章 X Window

    33.1 xhost:X服务器的访问控制程序 33.2 xinit:X Window系统初始化 33.3 Xlsclients:在显示器中列出正在运行的客户端应用程序 33.4 xlsfonts:显示 ...

  5. labview--http协议数据交互

    最近接了一个项目,需求是要将采集到的数据,以以下要求上报,并且提供接口供上层系统下发指令. 采用restful的http协议进行交互: 输入输出参数皆为json体. 响应包含三部分: Code:业务码 ...

  6. ORACLE高级部分内容

    1.pl/sql基本语句 DECLARE BEGIN END; / 循环语句 DECLARE I  NUMBER(2):=1; BEGIN WHILE I<100 LOOP I:=I+1; EN ...

  7. 标注点(Labeled Point)

    标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...

  8. 机器学习-支持向量机SVM

    简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...

  9. POJ 2287 田忌赛马 贪心算法

    田忌赛马,大致题意是田忌和国王赛马,赢一局得200元,输一局输掉200元,平局则财产不动. 先输入一个整数N,接下来一行是田忌的N匹马,下一行是国王的N匹马.当N为0时结束. 此题为贪心算法解答,有两 ...

  10. Advanced Fruits (最大公共子序列的路径打印)

    The company "21st Century Fruits" has specialized in creating new sorts of fruits by trans ...