本题链接: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+15;
int n,m,sz;
int t[maxn<<5][2],sum[maxn<<5],b[maxn],q[maxn];
inline int read(){char ch=getchar();int s=0,f=1;while (!(ch>='0'&&ch<='9')) {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}return s*f;
}
int ins(int last,int val)
{int res,k;res=k=++sz;for (int i=23;i>=0;i--){sum[k]=sum[last]+1;t[k][0]=t[last][0];t[k][1]=t[last][1];bool d=val&(1<<i);k=t[k][d]=++sz;last=t[last][d];}sum[k]=sum[last]+1;return res;
}
int query(int k1,int k2,int val)
{int res=0;for (int i=23;i>=0;i--){bool d=val&(1<<i);if (sum[t[k2][d^1]]-sum[t[k1][d^1]]>0){res|=(1<<i);k1=t[k1][d^1];k2=t[k2][d^1];}else k1=t[k1][d],k2=t[k2][d];}return res;
}
int main()
{n=read()+1;m=read();q[1]=ins(q[0],b[1]);for (int i=2;i<=n;i++){b[i]=b[i-1]^read();//注意插入trie的是前缀和 q[i]=ins(q[i-1],b[i]);}for (int i=1;i<=m;i++){char ch=getchar();while (!(ch=='A'||ch=='Q')) ch=getchar();if (ch=='A') {++n;b[n]=b[n-1]^read();q[n]=ins(q[n-1],b[n]);}else {int l=read(),r=read(),x=read();printf("%d\n",query(q[l-1],q[r],x^b[n]));}}return 0;
}

转载于:https://www.cnblogs.com/xxzh/p/9188295.html

BZOJ3261 最大异或和 解题报告(可持久化Trie树)相关推荐

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

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

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

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

  3. P4735 最大异或和(可持久化trie树、求最大区间异或和)

    P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...

  4. BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3519  Solved: 1493 [Submit][Status][Dis ...

  5. 省选专练(学习)可持久化Trie树(BZOJ3261)

    这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...

  6. P4735 最大异或和 01可持久化Trie树模板

    原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...

  7. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  8. C++解题报告——Rima(字典树+树形DP)

    题目描述 Adrian对单词押韵很感兴趣.如果两个单词的最长公共后缀的长度与两个单词中较长那个的长度一样,或者等于较长单词的长度减一,则这两个单词押韵.换句话说,如果A,B的最长公共后缀LCS(A,B ...

  9. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...

最新文章

  1. Kali Linux WPScan更新到2.9.3
  2. 【百度飞浆】YOLO系列目标检测算法详解
  3. 爆笑!物理书上的照片能不能好好选选啊喂!
  4. php ajax session死锁,session过期,ajax请求处理
  5. HTTP的短连接、长连接、管道连接流水线
  6. linux appium 安装教程,Ubuntu 系统安装 Appium 及样例运行教程
  7. 创建Django项目
  8. jsonobject中getkey_获取JSON中所有的KEY
  9. 本地文件搜索神器 --- Everything软件,快速搜索本地磁盘上的文件
  10. 《当程序员的那些狗日日子》(四十)繁杂的需求
  11. Linux下通过虚拟网卡实现局域网 转发tcp/udp流量
  12. 定制LK阶段开机LOGO
  13. 如何进行英文文献检索
  14. 设计一个程序,帮助小学生练习10以内的加法题目
  15. 简单操作拥有Win7/XP双系统
  16. AES 轮密钥(子密钥如何生成).md
  17. 面向深度学习系统的对抗样本攻击与防御
  18. apue学习第九天——标准I/O库(第五章)
  19. 计算机组织电脑义诊是什么,计科院计算机协会开展电脑义诊活动
  20. 已知道三个点求平面方程(这些玩意都忘了好久了~~)

热门文章

  1. (转)C# Delegate.Invoke、Delegate.BeginInvoke
  2. RecyclerView滑动到指定位置,并置顶
  3. 四周第四次课(1月5日) 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具...
  4. Java基础笔记12
  5. C# 字段 属性 方法 三霸主齐上阵
  6. Source Insight 格式化
  7. 转载的Web.config详解
  8. 改变客户端访问时的方法名
  9. C/C++内存管理详解
  10. HTTPS加密那点事--轻松秒懂HTTPS非对称加密