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. selenium自动化之显式等待和EC(expected_conditions)模块

    很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...

  2. 用libevent实现的echo服务器及telnet客户端

    以下代码在vs 2010编译通过,使用的libevent版本是:libevent-2.0.22,win7环境测试通过. 服务器实现: 1 流程图: 2 代码: // my_telnet.cpp : D ...

  3. POSTMan 快速上手(一图带你玩 Postman )

    POSTMan 快速上手(一图带你玩 Postman ):

  4. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

  5. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...

  6. visionpro9.0破解

    visionpro9.0软件下载 提供一个visionpro9.0视频教程学习网站:点击下面链接进入. ------------------------Halcon,Visionpro高清视频教程,点 ...

  7. linux 文件已经删除,但是空间没有释放的原因

    监控系统报告一台服务器的空间满了,登陆后发现/tmp下有大量access_log文件,分析是Apache的日志文件很久没有清理了,确认并执行删除操作. 但是,问题来了,执行 rm /tmp/acces ...

  8. 20145214 《Java程序设计》第5周学习总结

    20145214 <Java程序设计>第5周学习总结 教材学习内容总结 try和catch Java中所有错误都会被包装为对象,可以尝试try执行程序并捕捉catch代表错误的对象后做一些 ...

  9. win7 个人电脑 IIS7服务器(web服务器) 同一局域网下均可访问本机网页

    建立web服务器: 1.控制面板-->程序-->打开或关闭windows功能-->internet信息服务全部打钩,确定即可. 访问网页: 1.C:\inetpub\wwwroot\ ...

  10. python正则表达式函数match()和search()的区别详解

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找 ...