题意

给出一个长度为n的整数序列,给出m个操作。操作有两种。1,Ax表示在序列结尾增加x。2,Qlrx表示找到一个位置p满足 l<=p<=r,使得a[p] xor a[p+1]xor...xor a[n] xor x最大,并输出这个最大值。

分析

 今天学可持久化字典树的时候的找的一道模板题。对于这个题目其实只要学过主席树应该都能自己写出来(我照着主席树的套路写然后debug一下午然后发现num数组想错了mmp)

我们定义sum[i]为a[1]xor a[2] xor ...xor a[i]。那么对于每个询问操作Qlrx,我们要找出一个[l,r]内的p使得sum[n]xor sum[p-1] xor x最大.而显然sum[n]xor x是一个常数,所以我们要找到一个p使得sum[p-1]xor某个常数最大。

字典树的经典用法就是在一堆数字中,查询某个与x异或最大的是哪个数字。但是这个问题中有区间限制,所以我们需要将其可持久化。与线段树一样,我们记录每个历史版本,也就是前i个数字组成的字典树,根为root[i]。建树的思路和主席树几乎是完全一样的。只不过我们为了实现查询,多更新了一个num数组。因为主席树查询时候可以直接相减得到这个区间内各个数的数量,但是字典树不行,所以我们多维护一个num,来确定在[l,r]区间内,这个节点有没有走向0或者1的方法。

  

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring> using namespace std;
const int maxn=*;
int n,m,sz;
int ch[maxn][],a[maxn],root[maxn],sum[maxn],val[maxn],num[maxn][];
void update(int x,int y,int aa,int id){
root[x]=++sz;
x=root[x];
for(int i=;i>=;i--){
int c=(aa>>i)&;
num[x][c]+=num[y][c]+;
num[x][!c]=num[y][!c];
ch[x][!c]=ch[y][!c];
ch[x][c]=++sz;
memset(ch[sz],,sizeof(ch[sz]));
x=ch[x][c],y=ch[y][c];
}
val[x]=id;
} int query(int x,int y,int aa){
for(int i=;i>=;i--){
int c=(aa>>i)&;
if(num[x][!c]-num[y][!c])
x=ch[x][!c],y=ch[y][!c];
else
x=ch[x][c],y=ch[y][c];
}
return val[x];
} int main(){
scanf("%d%d",&n,&m);
sz=;
sum[]=;
update(,,,);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-]^a[i];
update(i,root[i-],sum[i],i);
}
char c;
int l,r,x;
for(int i=;i<=m;i++){
scanf(" %c",&c);
if(c=='A'){
n++;
scanf("%d",&a[n]);
sum[n]=sum[n-]^a[n];
update(n,root[n-],sum[n],n);
}else{
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",sum[query(root[r-],root[l-],x^sum[n])]^sum[n]^x);
}
}
return ;
}
//LQL

最新文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体
  2. Dynamic CRM2016在一台本地服务器安装部署
  3. robotframework+ride+Selenium2Library+AutoItLibrary配置
  4. 设置Linux时间 同步时间
  5. Java写一个简单学生管理系统
  6. android下tcpdump抓包
  7. FMS之Multi-point publishing技术
  8. C#获取指定月指定周的日期范围
  9. jQuery 学习笔记一
  10. jest 自动化测试
  11. 【LeetCode每天一题】Unique Paths(唯一的路径数)
  12. webpack4升级extract-text-webpack-plugin和UglifyJsPlugin问题
  13. go语言学习-goroutine
  14. 火狐浏览器firebug
  15. [转]Android 代码自动提示功能
  16. 慎重使用volatile关键字
  17. vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据。
  18. Alpha冲刺(11/10)
  19. ROS标定IDS相机
  20. VMware vCenter Server安装与配置

热门文章

  1. [datatables杂记] sAjaxSource 数据源 Search 后 fnInitComplete 不执行。
  2. Tr&#230;fɪk 服务发现解决方案
  3. bootstrap常用模态框
  4. qt的webkit
  5. Spring Framework中常见的事务传播陷阱(译文)
  6. python查找字符串 函数find() 用法
  7. 记录关于ubuntu无线上网只能ping通5~7个数据包的问题
  8. Mybatis扩展
  9. 安装scikit-image问题
  10. CORDIC逼近算法