【可持久化Trie】bzoj3261 最大异或和
对原序列取前缀异或值,变成pre[1...N],然后询问等价于求max{a[N]^x^pre[i]}(l-1<=i<=r-1)。
#include<cstdio>
#define INF 2147483647
#define N 300001
#define MAXBIT 25
int root[N<<1],ch[(N<<1)*(MAXBIT+1)][2],sz[(N<<1)*(MAXBIT+1)],tot;
int query(int L,int R,int W)//询问a[L...R]中W与其的最大异或值
{
int ans=0;
L=root[L];R=root[R+1];
for(int i=MAXBIT-1;i>=0;--i)
{
int Bit=(W>>i&1^1);
if(sz[ch[R][Bit]]-sz[ch[L][Bit]]==0)
Bit^=1;
else
ans+=1<<i;
R=ch[R][Bit];
L=ch[L][Bit];
}
return ans;
}
void add(int now,int W)//先add(1,0),再add(2...n+1,a[1...n])
{
int old=root[now-1];
root[now]=++tot;
now=root[now];
for(int i=MAXBIT-1;i>=0;--i)
{
int Bit=(W>>i&1);
sz[now]=sz[old]+1;
ch[now][Bit^1]=ch[old][Bit^1];
ch[now][Bit]=++tot;
now=ch[now][Bit];
old=ch[old][Bit];
}
sz[now]=sz[old]+1;
}
char op[2];
int a[N<<1],x,y,v,n,m,en;
int main()
{
add(1,0);
scanf("%d%d",&n,&m); en=n;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
a[i]^=a[i-1];
add(i+1,a[i]);
}
for(;m;--m)
{
scanf("%s",op);
if(op[0]=='A')
{
scanf("%d",&a[++en]);
a[en]^=a[en-1];
add(en+1,a[en]);
}
else
{
scanf("%d%d%d",&x,&y,&v);
printf("%d\n",query(x-1,y-1,v^a[en]));
}
}
return 0;
}
【可持久化Trie】bzoj3261 最大异或和的更多相关文章
- bzoj3261: 最大异或和 可持久化trie
题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
- BZOJ 3166 set+可持久化trie树(OR 莫队)
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By Siriu ...
- [HEOI2013]ALO(可持久化Trie+链表)
你永远不会相信一个快AFO的选手不会可持久化Trie. 其实异或粽子那题可以用可持久化Trie做,不过我还是没用,用的一般的Trie(其实可持久化是多此一举),于是到现在还是不会可持久化Trie. 这 ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 【bzoj3261】【最大异或和】可持久化trie树+贪心
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型:1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2.Q l r x:询问操 ...
- [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...
- 【BZOJ3261】最大异或和(可持久化Trie)
题意: 思路:可持久化Trie板子题,支持序列插入和询问 #include<bits/stdc++.h> using namespace std; typedef long long ll ...
随机推荐
- [poj 3281]最大流+建图很巧妙
题目链接:http://poj.org/problem?id=3281 看了kuangbin大佬的思路,还用着kuangbin板子orz http://www.cnblogs.com/kuangb ...
- spring中@PropertySource注解的使用
概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...
- oralce的客户端sqlplus
安装完oracle后,默认的客户端是sqlplus,还有一个公司常用的是PLSQLdeveloper 客户端软件,另外Navicat primie这个可以连接mysql.sqlserver.oracl ...
- centos6上使用fpm打python2.7 rpm包并兼容python2.6
centos6上使用fpm打python2.7 rpm包并兼容python2.6 作者 运维小兵_加油 关注 2016.09.22 00:28 字数 501 阅读 45评论 0喜欢 1 工作中我们常常 ...
- bzoj Gty的超级妹子树 块状树
Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 500 Solved: 122[Submit][Status][Discuss] De ...
- 打砖块(codevs 1257)
题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[ ...
- unity中绘制战争迷雾
接上一篇中说的游戏,我们已经实现了client.host上的一个物体可见不可见的行为.之后我们可以加入类似检查两个单位之间的距离.或是两个单位之间有无阻挡物来进一步实现游戏机制. 在这篇随笔中我会首先 ...
- HDU 2554 N对数的排列问题 ( 数学 )
题目链接 Problem Description 有N对双胞胎,他们的年龄分别是1,2,3,--,N岁,他们手拉手排成一队到野外去玩,要经过一根独木桥,为了安全起见,要求年龄大的和年龄小的排在一起,好 ...
- 从setting文件导包
两种方式 from project.settings.py import s3_key 第二种: from django.conf import setting s3_key = settings.S ...
- python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...