洛谷 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的小朋友们释放出大量的僵尸,企 ...
随机推荐
- Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
上次实现的自定义的Button功能是用的自定义的Rectangle来实现的,在慢慢的接触了QML之后,发现QML有自己定义的Button 这里盗版贴上Qt帮助文档中的部分关于Button的属性内容 B ...
- 使用postman实现半自动化
前些日子项目要上一个活动,其中有一个功能是幸运大转盘,用户可以随机抽奖,奖品有多种满减券及多种商品,但是奖品都是有抽中概率的,且有的商品还设置有库存,所以测试点便是测试抽奖的概率和库存.接下来拆分一下 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范
第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...
- mvc中actionresult的返回值类型
以前一直没注意actionresult都能返回哪些类型的类型值(一直用的公司的内部工具类初始化进行返回的),今天跟大家分享一下(也是转载的别人的日志qaq). 首先我们了解一下对action的要求: ...
- nginx 应用篇
nginx 信号控制(commanLine) kill singel pid ps aux|grep nginx nginx 有两个进程,一个 master 一个worker 一个master管理一 ...
- Python3 小工具-MAC泛洪
from scapy.all import * import optparse def attack(interface): pkt=Ether(src=RandMAC(),dst=RandMAC() ...
- Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
最新的版本可以在这里获取,目前下载的最新版本是5.08,更新于2016-02-03.在这里可以找到更多的说明. 下载好后,server端分为两个部分,一个是tracker,一个是storage.顾 ...
- lintcode-31-数组划分
数组划分 给出一个整数数组 nums 和一个整数 k.划分数组(即移动数组 nums 中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置 ...
- OSPF学习中的问题
OSPF对接两方,对设置的要求,哪些参数必须相同 (HELLO &dead interval, area ID, authentation, 末节区域(option中的E位), network ...
- 浅谈 Vue v-model指令的实现原理 - 如何利用v-model设计自定义的表单组件
原文请点击此链接 链接1 http://www.7zhang.com/index/cms/read/id/234515.html 链接2 http://blog.csdn.net/yangbing ...