本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261

题目描述

给定一个非负整数序列{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 最大,输出最大是多少。

输入

第一行包含两个整数 N  ,M,含义如问题描述所示。   
第二行包含 N个非负整数,表示初始的序列 A 。 
接下来 M行,每行描述一个操作,格式如题面所述。

输出

假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。

样例输入

5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
对于测试点 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。

样例输出

4
5
6
 

题解:

在这道题目之前,我想读者需要一个前置知识便于理解。请看我的另一篇博客:https://www.cnblogs.com/xxzh/p/9178838.html
如果学会了这个知识的话,也就是知道了如何使用一颗01 Trie树
那么考虑这道题,很显然,现在我们需要维护一颗可持久化trie树。如果不清楚静态主席树原理的,请移步我的另一篇博客:https://www.cnblogs.com/xxzh/p/9158819.html
 
正式开始对这题讲解:
对于每次操作Q,它给的算式太鬼了,实际上应该化成max( (a[n] xor x)xor a[p-1] ) p∈[l,r];
 
对每个前置建立Trie,建立原理参考主席树博客。
在建树的过程中,很重要的一点就是我们每次插入的节点其实是原来a数组中的前缀。也就是说我们维护的是前缀和的前缀(有点绕读者仔细琢磨)
 
然后注意看算式,我们每次找的其实是p-1,注意是p-1而不是p。
也就是本来我们query查找的应该是l-1到r,由于是p-1我们现在查找的是l-2到r-1
当然,对于处理p-1我们也有方法,只需要在原来的数组a之前加一个0,这样的话就可以直接算l-1到r了
 
具体的操作还是贪心的从高位到低位建立Trie,查询的时候注意减一下
下面附上代码:
#include<bits/stdc++.h>
using namespace std; const int maxn=6e5+;
int n,m,sz;
int t[maxn<<][],sum[maxn<<],b[maxn],q[maxn];
inline int read(){
char ch=getchar();
int s=,f=;
while (!(ch>=''&&ch<='')) {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int ins(int last,int val)
{
int res,k;
res=k=++sz;
for (int i=;i>=;i--)
{
sum[k]=sum[last]+;
t[k][]=t[last][];t[k][]=t[last][];
bool d=val&(<<i);
k=t[k][d]=++sz;last=t[last][d];
}
sum[k]=sum[last]+;
return res;
}
int query(int k1,int k2,int val)
{
int res=;
for (int i=;i>=;i--)
{
bool d=val&(<<i);
if (sum[t[k2][d^]]-sum[t[k1][d^]]>){
res|=(<<i);
k1=t[k1][d^];
k2=t[k2][d^];
}
else k1=t[k1][d],k2=t[k2][d];
}
return res;
}
int main()
{
n=read()+;m=read();
q[]=ins(q[],b[]);
for (int i=;i<=n;i++)
{
b[i]=b[i-]^read();//注意插入trie的是前缀和
q[i]=ins(q[i-],b[i]);
}
for (int i=;i<=m;i++)
{
char ch=getchar();
while (!(ch=='A'||ch=='Q')) ch=getchar();
if (ch=='A') {
++n;
b[n]=b[n-]^read();
q[n]=ins(q[n-],b[n]);
}
else {
int l=read(),r=read(),x=read();
printf("%d\n",query(q[l-],q[r],x^b[n]));
}
}
return ;
}

BZOJ3261 最大异或和 解题报告(可持久化Trie树)的更多相关文章

  1. [十二省联考2019] 异或粽子 解题报告 (可持久化Trie+堆)

    interlinkage: https://www.luogu.org/problemnew/show/P5283 description: solution: 显然有$O(n^2)$的做法,前缀和优 ...

  2. HDU4825:Xor Sum 解题报告(0/1 Trie树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数. 随后 Prometheus 将向 Ze ...

  3. 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)

    点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...

  4. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  5. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

  6. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.       有M个操作,有以下两种操作类型:1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2.Q l r x:询问操 ...

  7. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

  8. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  9. bzoj 3261: 最大异或和 (可持久化trie树)

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Description       给定一个非负整数序列 {a},初始长度为 N.       ...

随机推荐

  1. 搜狗面试的经典题(C++map按值排序,class struct的差别)

    一:起因 (1)java  Map排序(key,value).请看还有一篇博客 java Map排序 (2)c++ map排序(key,value),能够对c++ map和java Map进行对照:之 ...

  2. lua简单类的实现

    原文地址:http://blog.csdn.net/qqmcy/article/details/37725177 类实现: MyClass = class("MyClass") - ...

  3. Unity3d修炼之路:用Mesh绘制一个Cube

    #pragma strict function Awake(){ var pMeshFilter : MeshFilter = gameObject.AddComponent(typeof(MeshF ...

  4. POJ 2318 叉积判断点与直线位置

    TOYS   Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom ...

  5. zzulioj--1790-- 弹珠游戏(数学水题!)

    弹珠游戏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 14  Solved: 10 SubmitStatusWeb Board Descriptio ...

  6. angular4过滤器

    Angular4中过滤器 一.大小写转换过滤器 uppercase将字符串转换为大写 lowercase将字符串转换为小写 <p>将字符串转换为大写{{str | uppercase}}& ...

  7. 乔治·霍兹(George Hotz):特斯拉、谷歌最可怕的对手!

    17岁破解iPhone,21岁攻陷索尼PS3:现在,他是埃隆·马斯克最可怕的对手.   黑客往事   许多年后,当乔治·霍兹(George Hotz)回首往事,一定会把2007年作为自己传奇人生的起点 ...

  8. 创建ios界面的三步骤

    1.加载数据 (包括懒加载和字典转模型等) 2.搭建界面 (常见的有九宫格算法和for循环的嵌套等) 3.实现用户交互 (通常用按钮实现)

  9. spark thrift server configuration

    # MainApplicationProperties # --master yarn --deploy-mode client 下的配置, client 模式表示,driver 是在本地机器上跑的, ...

  10. TLCL

    参考阅读:http://billie66.github.io/TLCL/book/chap04.html 绝对路径 An absolute pathname begins with the root ...