[BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description
给定一个非负整数序列{a},初始长度为N。
有M个操作,有以下两种操作类型:
1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。
2、Q l r x:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:
a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。
Input
第一行包含两个整数 N ,M,含义如问题描述所示。
第二行包含 N个非负整数,表示初始的序列 A 。
接下来 M行,每行描述一个操作,格式如题面所述。
Output
假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。
Sample Input
5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
Sample Output
4
5
6
Hints
对于测试点 1-2,N,M<=5 。
对于测试点 3-7,N,M<=80000 。
对于测试点 8-10,N,M<=300000 。
其中测试点 1, 3, 5, 7, 9保证没有修改操作。
0<=a[i]<=10^7。
Solution
又是一道可持久化 Trie 的套路题,不过一开始被建树难住了...
分析题目:
- 异或有基本性质即 : \({({x}\bigoplus{y})}\bigoplus{y}=x\) .
- 此题要求我们求 \({({a_{p}}\bigoplus{a_{i}})}\bigoplus{a_{n}}\)的值,即\({sum_{p-1}}\bigoplus{sum_{n}}\),其中\(sum\)代表从根节点出发的异或前缀和.
那么我们思路也就很明了了。
我们在Trie中插入每一个前缀和,然后在查询的时候直接查询\((l-2,r-1)\)即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=300008;
int T[maxn*2],ch[2*maxn*32][2];
int num[2*maxn*32],n,m;
ll a[maxn*2],tot;
int insert(int pre,ll x,int v)
{
int rt=++tot;
ll c=((x>>v)&1);
ch[rt][0]=ch[pre][0];
ch[rt][1]=ch[pre][1];
num[rt]=num[pre]+1;
if(v>=0)
ch[rt][c]=insert(ch[pre][c],x,v-1);
return rt;
}
ll ans;
void query(int l,int r,ll x,int v)
{
ll c=((x>>v)&1);
if(num[ch[r][c^1]]-num[ch[l][c^1]]>0)
{
ans+=(1<<v);
if(v>=0)
query(ch[l][c^1],ch[r][c^1],x,v-1);
}
else
if(v>=0)
query(ch[l][c],ch[r][c],x,v-1);
}
ll sum[maxn*2];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]^a[i];
for(int i=1;i<=n;i++)
T[i]=insert(T[i-1],sum[i],30);
for(int i=1;i<=m;i++)
{
ll x,y,z;
char ch[10]; scanf("%s ",ch);
if(ch[0]=='A')
{
scanf("%lld",&x);
n++;
sum[n]=sum[n-1]^x;
T[n]=insert(T[n-1],sum[n],30);
}
else
{
scanf("%lld%lld%lld",&x,&y,&z);
z=z^sum[n];
ans=0;
if(y==1){cout<<z<<endl;continue;}
query(T[x-2],T[y-1],z,30);
cout<<ans<<endl;
}
}
}
[BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)的更多相关文章
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- BZOJ_3689_异或之_可持久化Trie+堆
BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...
- [十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
- bzoj3261: 最大异或和 可持久化trie
题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
- 【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/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
随机推荐
- spring maven 包
<spring-framework.version>.RELEASE</spring-framework.version> <dependency> <gro ...
- no pointer in java
Why there are no pointers in Java? In Java there are references instead of pointers. These reference ...
- 汉明码(Hamming Code)原理及实现
汉明码实现原理 汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码.汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误.(要注意的是,汉明码只能发现和修正一位错误,对于两位或 ...
- 【线性基】bzoj2322: [BeiJing2011]梦想封印
线性基的思维题+图常见套路 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引 ...
- Spring Security 与 OAuth2(介绍)
https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 OAuth2(介绍) 林塬 2018.01.23 11:14* 字数 3097 阅读 ...
- 将远程分支拷贝到本地,并更新代码push到原分支
第一步:git clone +主分支 第二步:git fetch origin 分支名 第三步:git checkout -b 分支名 origin/分支名 第四步:git pull origin 分 ...
- linux 上安装配置l2tp的客户端
有些时候我们外网linux服务器需要访问内网的服务器,这时候就需要在外网服务器上配置l2tp的客户端,连接到VPN访问内网服务器. 安装: yum -y install xl2tpd ppp 安装成功 ...
- 如何在 CentOS 7 上安装 Python 3
当前最新的 CentOS 7.5 默认安装的是 Python 2.7.5,并且默认的官方 yum 源中不提供 Python 3 的安装包.这里主要介绍两种在 CentOS 7 中安装 Python 3 ...
- LeetCode(168) Excel Sheet Column Title
题目 Given a positive integer, return its corresponding column title as appear in an Excel sheet. For ...
- PTA 7-2 符号配对
直接用栈模拟即可,数组可做,但因为这节数据结构是栈,为了期末考试还是手写一下栈的操作,值得注意的是,这道题用gets函数在PTA上会编译错误,用scanf("%[^\n]", st ...