洛谷 P4735 最大异或和 解题报告
P4735 最大异或和
题目描述
给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。
有\(M\)个操作,有以下两种操作类型:
A x
:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N+1\)。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 最大异或和 解题报告的更多相关文章
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- 【题解】洛谷P4735最大异或和
学习了一下可持久化trie的有关姿势~其实还挺好理解的,代码也短小精悍.重点在于查询某个历史版本的trie树上的某条边是否存在,同样我们转化到维护前缀和来实现.同可持久化线段树一样,我们为了节省空间继 ...
- [洛谷P4735]最大异或和
题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- 洛谷 P1972 [SDOI2009]HH的项链 解题报告
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
随机推荐
- Javascript打印网页局部的实现方案
项目中,需要对页面的部分div进行打印,为了保证界面布局不乱,采取了新建iframe的方法. 将需要打印的div放到iframe中,然后调用iframe进行打印,就可以很好的实现局部打印的效果了. 同 ...
- 博客更换至 www.zhaoch.top
博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系 ...
- HDU 1394Minimum Inversion Number
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
- 开源自动驾驶仿真平台 AirSim (3) - 运行 AirSim
AirSim 的官方 Github: https://github.com/Microsoft/AirSim 之前配置了很多,终于要让 AirSim 自己跑起来了. 我们需要把 AirSim 这个插件 ...
- Apache——访问控制
Order 指定执行允许访问规则和拒绝访问规则 Deny 定义拒绝访问列表 Allow 定义允许访问列表 Order allow,deny 先执行允许,再执行拒绝 Order deny,allow ...
- Spring 3整合Quartz 2实现定时任务:动态添加任务
先展示一下后台管理定时任务效果图: 1.新增任务页面: 2.列表页(实现任务的禁用启用) 3.数据库脚本: -- ------------------------------ Table struct ...
- [leetcode-666-Path Sum IV]
If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digit ...
- POJ 3845 Fractal(计算几何の旋转缩放)
Description Fractals are really cool mathematical objects. They have a lot of interesting properties ...
- python中argparse库的使用教程链接
这两篇文章详细介绍了argparse库的参数设置及使用包括位置参数与可选参数的用法 http://blog.csdn.net/guojuxia/article/details/44462381 htt ...
- 软件工程part5
1.本周psp 2.本周饼状图 3.本周进度条