博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.3261.最大异或和(可持久化Trie)
阅读量:4954 次
发布时间:2019-06-12

本文共 1145 字,大约阅读时间需要 3 分钟。

这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值。

\(p-1\in [l-1,r-1]\),用可持久化Trie查区间[l-1,r-1] xor x xor sum[1~n]的最大值即可。
另外可持久化Trie查的是区间某一个数异或另一个数的最大值,所以要插入的是前缀和。

注意对于区间[1,1]的询问是可以用0 xor的,所以要在前面加上这个0,而且不能在root[0]加(除非用root[l-2=-1])。不妨直接向右偏移1,在root[1]插入这个0。

//179000kb  3508ms#include 
#include
#include
//#define gc() getchar()#define MAXIN 50000#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)#define BIT 23const int N=6e5+5;//N+M!int root[N];char IN[MAXIN],*SS=IN,*TT=IN;struct Trie{ #define S N*25 int tot,son[S][2],sz[S]; void Insert(int x,int y,int v) { for(int i=BIT; ~i; --i) { int c=v>>i&1; son[x][c]=++tot, son[x][c^1]=son[y][c^1]; x=tot/*son[x][c]*/, y=son[y][c]; sz[x]=sz[y]+1; } } int Query(int x,int y,int v)//x~y { int res=0; for(int i=BIT; ~i; --i) { int c=(v>>i&1)^1; if(sz[son[y][c]]-sz[son[x][c]]>0) x=son[x][c], y=son[y][c], res|=1<

转载于:https://www.cnblogs.com/SovietPower/p/9717663.html

你可能感兴趣的文章
webpack最佳入门实践系列(07)
查看>>
Office365学习笔记—Lookup类型加载条目过多解决方案
查看>>
MySQL update select组合
查看>>
Angular05 angular架构、搭建angular开发环境、组件必备三要素、angular启动过程
查看>>
asp程序调试
查看>>
VB.Net中 Module 的前世今生
查看>>
ASP.NET MVC 创建前台链接到View的标签和前台向后台传值
查看>>
2013-5-20~24 周报 公司建言
查看>>
ClientScript.GetCallbackEventReference几个参数的使用实例
查看>>
cocos3.x - lua vs2013环境搭建及项目创建示例
查看>>
Android布局学习——android:gravity和android:layout_gravity的区别
查看>>
街机扫描线_自定义配置文件提交区
查看>>
git配置,以及简单的命令
查看>>
可拖曳
查看>>
Java语言中,类所拥有的“孩子”,他们的关系是怎样的
查看>>
ExtAspNet 本地化战略调整
查看>>
Linux操作系统常用命令合集——第二篇- 用户和组操作(15个命令)
查看>>
C#日期格式转换
查看>>
php CI框架高级视图功能,视图继承,多重继承,视图片段
查看>>
Codeforces 662D International Olympiad【贪心】
查看>>