浅谈\(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)\)

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn=3e5+5; char s[5];
int rt[maxn<<1];
int cnt,n,m,xor_sum; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct Trie {
int tot; struct node {
int sum;
int son[2];
}p[maxn*48]; void ins(int lst_id,int id,int v) {
int lst=rt[lst_id],u;
u=rt[id]=++tot;
for(int i=24;~i;i--) {
int c=v>>i&1;
p[u].son[c]=++tot;
u=p[u].son[c],lst=p[lst].son[c];
p[u]=p[lst];p[u].sum++;
}
} void make_ans(int u2,int u1,int v) {
int ans=0;
for(int i=24;~i;i--) {
int c=v>>i&1;
int sum=p[p[u1].son[c^1]].sum;
sum-=p[p[u2].son[c^1]].sum;
if(!sum)ans=ans<<1,u1=p[u1].son[c],u2=p[u2].son[c];
else ans=ans<<1|1,u1=p[u1].son[c^1],u2=p[u2].son[c^1];
}
printf("%d\n",ans);
}
}T; int main() {
cnt=n=read(),m=read();
for(int i=1;i<=n;i++) {
int x=read();xor_sum^=x;
T.ins(i-1,i,xor_sum);
}
for(int i=1;i<=m;i++) {
scanf("%s",s+1);
if(s[1]=='A') {
int x=read();xor_sum^=x,cnt++;
T.ins(cnt-1,cnt,xor_sum);
}
else {
int l=read(),r=read(),x=read();
if(r==1) {printf("%d\n",x^xor_sum);continue;}
T.make_ans(rt[max(0,l-2)],rt[r-1],x^xor_sum);
}
}
return 0;
}

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. guava的事件发布订阅功能

    事件的重要性,不用说很重要,在很多时候我们做完一个操作的时候,需要告知另外一个对象让他执行相应操作,比如当用户注册成功的时候,需要抛出一个注册成功的事件,那么有监听器捕获到这个事件,完成后续用户信息初 ...

  2. Java解析XML格式串(JDOM解析)

    import java.io.IOException; import java.io.StringReader; import java.util.List; import org.jdom.Docu ...

  3. iptables详解(13):iptables动作总结之二

    概述 阅读这篇文章需要站在前文的基础上,如果你在阅读时遇到障碍,请参考之前的文章. 前文中,我们已经了解了如下动作 ACCEPT.DROP.REJECT.LOG 今天,我们来认识几个新动作,它们是: ...

  4. VUE基本安装

    // 安装脚手架 cnpm install -g vue-cli // 初始化项目 vue init webpack 项目名称 // 安装依赖 cd 项目名称 cnpm i // 安装stylus c ...

  5. 转载:left join和left semi join的联系和区别

    1.联系 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map ...

  6. 015PHP基础知识——流程控制(三)

    <?php /** *流程控制(三) */ /* 循环结构: while(){ } */ //设置脚本最长执行时间:100秒 //set_time_limit(100); $lantian = ...

  7. APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量

    线程同步     同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性.     假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...

  8. iOS 阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  9. mac 使用 pf 做端口转发

    Mac os中我发现直接输入localhost是拒绝访问的,原因在于OSX 对于1024内端口需要 root 权限,因此需要做一个80端口的转发. 曾经的 ipfw 已经被 pf 所替换. 首先我们要 ...

  10. 动态PIVOT行转列

    id name subject score remark1 l math 86 2 l eng 68 3 l phy 88 4 z chn 99 5 z math 92 6 z com 98 7 z ...