浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3261

假设现在所有数的异或和是\(xor\_sum\),\(sum\_xor[i]\)表示前\(i\)个数的异或和,那么每次询问可以转化成:

在区间\([l-1,r-1]\)里面找一个\(sum\_xor_i\),使得\(sum\_xor_i\oplus x\oplus xor\_sum\)最大值。

我们已经知道了\(x\oplus xor\_sum\)的值,只需要按照每一位去贪心地找\(sum\_xor_i\)的合适的值就行了。

由于是在区间内找有没有某一位存在我想要的,显然就能想到可持久化了。

时间复杂度:\(O((n+m)*24)\)

空间复杂度:\(O((n+m)*24)\)

代码如下:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn=3e5+5;
  6. char s[5];
  7. int rt[maxn<<1];
  8. int cnt,n,m,xor_sum;
  9. int read() {
  10. int x=0,f=1;char ch=getchar();
  11. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  12. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
  13. return x*f;
  14. }
  15. struct Trie {
  16. int tot;
  17. struct node {
  18. int sum;
  19. int son[2];
  20. }p[maxn*48];
  21. void ins(int lst_id,int id,int v) {
  22. int lst=rt[lst_id],u;
  23. u=rt[id]=++tot;
  24. for(int i=24;~i;i--) {
  25. int c=v>>i&1;
  26. p[u].son[c]=++tot;
  27. u=p[u].son[c],lst=p[lst].son[c];
  28. p[u]=p[lst];p[u].sum++;
  29. }
  30. }
  31. void make_ans(int u2,int u1,int v) {
  32. int ans=0;
  33. for(int i=24;~i;i--) {
  34. int c=v>>i&1;
  35. int sum=p[p[u1].son[c^1]].sum;
  36. sum-=p[p[u2].son[c^1]].sum;
  37. if(!sum)ans=ans<<1,u1=p[u1].son[c],u2=p[u2].son[c];
  38. else ans=ans<<1|1,u1=p[u1].son[c^1],u2=p[u2].son[c^1];
  39. }
  40. printf("%d\n",ans);
  41. }
  42. }T;
  43. int main() {
  44. cnt=n=read(),m=read();
  45. for(int i=1;i<=n;i++) {
  46. int x=read();xor_sum^=x;
  47. T.ins(i-1,i,xor_sum);
  48. }
  49. for(int i=1;i<=m;i++) {
  50. scanf("%s",s+1);
  51. if(s[1]=='A') {
  52. int x=read();xor_sum^=x,cnt++;
  53. T.ins(cnt-1,cnt,xor_sum);
  54. }
  55. else {
  56. int l=read(),r=read(),x=read();
  57. if(r==1) {printf("%d\n",x^xor_sum);continue;}
  58. T.make_ans(rt[max(0,l-2)],rt[r-1],x^xor_sum);
  59. }
  60. }
  61. return 0;
  62. }

BZOJ3261:最大异或和的更多相关文章

  1. bzoj3261: 最大异或和

    可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...

  2. ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】

    题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...

  3. BZOJ3261最大异或和——主席树

    题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p ...

  4. bzoj3261: 最大异或和 可持久化trie

    题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

  5. 2018.08.04 bzoj3261: 最大异或和(trie)

    传送门 简单可持久化01trie树. 实际上这东西跟可持久化线段树貌似是一个东西啊. 要维护题目给出的信息,就需要维护前缀异或和并且把它们插入一棵01trie树,然后利用贪心的思想在上面递归就行了,因 ...

  6. bzoj3261: 最大异或和 (可持久化trie树)

    题目链接 题解 看到异或和最大就应该想到01 trie树 我们记\(S_i\)为前i项的异或和 那么我们的目的是最大化\(S_n\)^\(x\)^\(S_{j-1}\) \((l <= j &l ...

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

    对原序列取前缀异或值,变成pre[1...N],然后询问等价于求max{a[N]^x^pre[i]}(l-1<=i<=r-1). #include<cstdio> #defin ...

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

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

  9. [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)

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

  10. BZOJ3261 最大异或和 【可持久化trie树】

    题目 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

随机推荐

  1. Linux 策略路由配置

    策略路由配置 #编辑rt_tables echo "192 net_192 " >> /etc/iproute2/rt_tables echo "196 ne ...

  2. golang简易版聊天室

    功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊:   单聊: 服务端: package main import ( "fmt" ...

  3. C#常用函数与方法集合

    1.DateTime   数字型         System.DateTime currentTime=new System.DateTime();    1.1 取当前年月日时分秒         ...

  4. SpringCloud_00_资源帖

    一.官方资料 spring-cloud reference springcloud中文网 Spring Cloud 官方中文文档(dalston) 二.精选资料 1.翟永超-<Spring Cl ...

  5. PHP 中使用explode()函数切割字符串为数组

    explode()函数的作用:使用一个字符串分割另一个字符串,打散为数组. 例如: 字符串 $pizza = "第1 第2 第3 第4 第5 第6"; 根据空格分割后:$piece ...

  6. DataTable和实体类通过反射相互转换

    using System.Runtime.Serialization; using System.Data; using System.Reflection; using System.Collect ...

  7. linux和windows双系统设置默认启动系统

    1.以root身份登录linux系统: 2.启动终端,输入命令:vi /boot/grub/grub.conf,文件内容如下: #boot=/dev/sda default=0 (默认启动哪个系统的设 ...

  8. gradle-wrapper.properties中各属性的含义

    gradle-wrapper.properties中各属性的含义 1. gradle-wrapper.properties 每一个用gradle编译的工程,都会有一个gradle\wrapper目录. ...

  9. iad 集成三两事

    1. 好像是随着ios8的beta开始.  iad 已经发生了一些变化. 比如找不到enable iad network 的按钮了. 貌似是不需要手动去 enable 了. 只需要嵌入 iad fra ...

  10. python 帮助和导入路径

    1 help('**'),查看函数用法,其中**为内置的函数 help(**.**),模块.函数,查看非内置函数 2 先添加路径到sys,再导入 import sys;sys.path.append( ...