Description

给定一个非负整数序列{a},初始长度为N。
有M个操作,有以下两种操作类型:
1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。
2、Qlrx:询问操作,你需要找到一个位置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行,每行一个整数表示询问的答案。

题意:应该很清楚了;

题解:

①原题中的式子比较假: 化成max( (a[n] xor x)xor a[p-1] ) p∈[l,r];

②前面的now = (a[n] xor x)是一个定值,建立一颗字典树,从高位到低位考虑,一定是尽量选和now的那一位相反的数,对前缀建树,如果类似于普通01字典树,只是把一个数字插入经过的所有节点++,这个可持久的结构维护sum[r]-sum[l-1]第i位的节点值位0或1的个数;

③查询时,从高到低枚举位数j,如果和now的j位相反的数个数在sum[r]-sum[l-1]内存在,则进入这个节点,否则进入另一个节点执行同样操作,每次更新选择的数的j位

    

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=,S = ;
  6. int n,m,a[N],b[N],x,rt[N],sz,ch[N*S][],sum[N*S];
  7. char gc(){
  8. static char *p1,*p2,s[];
  9. if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
  10. return(p1==p2)?EOF:*p1++;
  11. }
  12. int rd(){
  13. int x = ; char c = gc();
  14. while(c<''||c>'') c = gc();
  15. while(c>=''&&c<='') x = x * + c - '',c = gc();
  16. return x;
  17. }
  18. bool opt(){
  19. char c = gc();
  20. while(c!='A'&&c!='Q') c = gc();
  21. return c=='A';
  22. }
  23. int ins(int last,int val){
  24. int k,ret; k = ret = ++sz;
  25. for(int i = ;i >= ;i--){
  26. sum[k] = sum[last] + ; ch[k][] = ch[last][]; ch[k][] = ch[last][];
  27. int d = (val>>i)&;
  28. k = ch[k][d] = ++sz; last = ch[last][d];
  29. }
  30. sum[k] = sum[last] + ;
  31. return ret;
  32. }
  33. int query(int k1,int k2,int val){
  34. int ret = ;
  35. for(int i = ;i >= ;i--){
  36. int d = (val>>i)&;
  37. if(sum[ch[k2][d^]]-sum[ch[k1][d^]]>)
  38. ret|=(<<i),k1=ch[k1][d^],k2=ch[k2][d^];
  39. else k1=ch[k1][d],k2=ch[k2][d];
  40. }
  41. return ret;
  42. }
  43. int main()
  44. { freopen("bzoj3261.in","r",stdin);
  45. freopen("bzoj3261.out","w",stdout);
  46. n = rd()+; m = rd();
  47. rt[]=ins(rt[],b[]);
  48. for(int i = ;i <= n;i++) b[i] = b[i-]^rd(),rt[i]=ins(rt[i-],b[i]);
  49. char s[];
  50. for(int i = ;i <= m;i++){
  51. if(opt()){
  52. n++; b[n]=b[n-]^rd();
  53. rt[n]=ins(rt[n-],b[n]);
  54. }
  55. else {
  56. int l = rd(),r = rd(),x = rd();
  57. int tmp = query(rt[l-],rt[r],b[n]^x);
  58. printf("%d\n",tmp);
  59. }
  60. }
  61. return ;
  62. }//by tkys_Austin;

bzoj 3261最大异或和的更多相关文章

  1. BZOJ 3261: 最大异或和( 可持久化trie )

    搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...

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

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

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

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

  4. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  5. BZOJ 3261 最大异或和(算竞进阶习题)

    可持久化Trie 需要知道一个异或的特点,和前缀和差不多 a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x 所以我们把a[1. ...

  6. bzoj 3261 最大异或和 可持久化字典树(01树)

    题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...

  7. bzoj 3261 最大异或和【可持久化trie】

    因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...

  8. BZOJ 3261 最大异或和 (可持久化01Trie)

    题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...

  9. 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和

    题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...

随机推荐

  1. NetFPGA-1G-CML点亮 LED

    前言 用vivado建立工程的时候选择的型号为:XC7K325tffg676-1 在以下代码文件中,仿真与设计都没有问题.在xdc文件中的时钟约束与锁相环配置中还存在问题,没有寻找到解决办法 使用手册 ...

  2. WebApi 方法的参数类型总结。

    1:[HttpGet]  ①:get方法之无参数. [HttpGet] public IHttpActionResult GetStudentInfor() { List<StudentMode ...

  3. EasyUI 主布局整合。

    博文学习地址:http://www.cnblogs.com/xishuai/p/3620327.html html: <%@ Page Language="C#" AutoE ...

  4. python小练习之三---购物车程序

    购物车购物的例子 严格来讲,这个例子相对大一些 功能也稍完备一些,具有用户登录,商品上架,用户购物,放入购物车,展示每个用户的购物车里的商品的数量,用户账户余额,支持用户账户充值等 下面展示的代码有些 ...

  5. 用nodejs 开发的智能提示

    用nodejs 开发的智能提示 时间:2014-07-01 03:50:18 类别:搜索引擎 访问: 2576 次 感谢:http://lutaf.com/223.htm 智能提示对于搜索非常重要,相 ...

  6. VMware vCenter Server 6.5.0 U1

    VMware vCenter Server 6.5.0 U1gName: VMware-VCSA-all-6.5.0-8024368.iso Release Date: 2018-03-20 Buil ...

  7. ios开发常识(1)开发语言和参考资料

    学iphone开发用的语言是object-c,object-c和c++,java还是有很大区别,如果你坚持学习iphone开发的话可以不学c++,java,直接学习这个语言,先入为主,可能觉得这个语言 ...

  8. SpringCloud的服务消费者 (一):(rest+ribbon)访问注册的微服务

    采用Ribbon或Feign方式访问注册到EurekaServer中的微服务.1.Ribbon实现了客户端负载均衡,Feign底层调用Ribbon2.注册在EurekaServer中的微服务api,不 ...

  9. FatMouse's Speed ~(基础DP)打印路径的上升子序列

    FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take ...

  10. java线程池01-ThreadPoolExecutor构造方法参数的使用规则

    为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用. 其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这 ...