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

-------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
 
using namespace std;
 
#define b(x) (1 << (x))
#define Rt(x) Root[(x) + 1]
 
const int maxn = 600009;
const int Log = 25;
 
int N, M, TOT;
int w[maxn];
 
inline int read() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
struct Node {
Node* ch[2];
int cnt;
Node() : cnt(0) {
}
} pool[maxn * Log], *pt, *Root[maxn], *Null;
 
void Init_Trie() {
pt = pool;
Null = pt++;
Null->ch[0] = Null->ch[1] = Null;
}
 
Node* Insert(Node* t, int Val, int w) {
Node* h = pt++;
h->cnt = t->cnt + 1;
if(w < 0) return h;
int v = Val & b(w) ? 1 : 0;
h->ch[v ^ 1] = t->ch[v ^ 1];
h->ch[v] = Insert(t->ch[v], Val, w - 1);
return h;
}
 
int Query(Node* L, Node* R, int Val) {
int ret = 0;
for(int i = Log; i >= 0; i--) {
int v = Val & b(i) ? 1 : 0;
if(R->ch[v ^ 1]->cnt > L->ch[v ^ 1]->cnt) {
ret |= b(i);
L = L->ch[v ^ 1];
R = R->ch[v ^ 1];
} else
L = L->ch[v], R = R->ch[v];
}
return ret;
}
 
void Init() {
Init_Trie();
Root[0] = Null;
Rt(0) = Insert(Root[0], 0, Log);
N = read(); M = read();
w[0] = 0;
for(int i = 1; i <= N; i++)
Rt(i) = Insert(Rt(i - 1), w[i] = read() ^ w[i - 1], Log);
TOT = w[N];
}
 
void Solve() {
while(M--) {
char c; scanf(" %c", &c);
if(c == 'A') {
w[++N] = read();
w[N] ^= w[N - 1];
Rt(N) = Insert(Rt(N - 1), TOT = w[N], Log);
} else {
int l = read() - 2, r = read() - 1, x = read();
x ^= TOT;
printf("%d\n", Query(Rt(l), Rt(r), x));
}
}
}
 
int main() {
Init();
Solve();
return 0;
}

-------------------------------------------------------------------------

3261: 最大异或和

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 946  Solved: 398
[Submit][Status][Discuss]

Description

     

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

Sample Input

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保证没有修改操作。
对于 100% 的数据, 0<=a[i]<=10^7。

Sample Output

4
5
6

HINT

对于      100%  的数据,     0<=a[i]<=10^7  。

Source

BZOJ 3261: 最大异或和( 可持久化trie )的更多相关文章

  1. BZOJ 3261 最大异或和 可持久化Trie树

    题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 3261: 最大异或和

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

  8. 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. ...

  9. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

随机推荐

  1. HDU 3698 DP+线段树

    给出N*M矩阵.每一个点建立灯塔有花费.每一个点的灯塔有连接范围,求每一行都建立一个灯塔的最小花费,要求每相邻两行的灯塔能够互相连接.满足 |j-k|≤f(i,j)+f(i+1,k) DP思路,dp[ ...

  2. C#格式化成小数

    datagridview某列格式化成两位小数 ............................................................................. ...

  3. asp.net 使用HttpModule记录全局错误

    以前使用Global.asax记录全局的错误日志觉得挺好用,但是如果一个解决方案下有N多个项目,每个下边都需要加一个并且代码都还是重复的,终于有一天无法再忍受这种模式,考虑到HttpModule,直接 ...

  4. iOS 自定义button

    UIButton默认的布局是左侧image,右侧title,如果想要改变image与title的frame,直接设置是不会有效果的.可以通过titleEdgeInsets.imageEdgeInset ...

  5. workspace & subProject & target

    workspace & subProject & target http://blog.itpub.net/12231606/viewspace-1079867/ 最近新入一个项目组, ...

  6. 为什么用户主目录下.bash_profile没有自动执行

    请注意 一般登录当前用户后 .bash_profile会自动运行 如果不自动运行请查看是不是切换用户的时候使用的su 用户名而不是su - 用户名 添加中间这个 - 后 会除了切换用户外还会加载该用户 ...

  7. 利用oxygen编辑并生成xml文件,并使用JAVA的JAXB技术完成xml的解析

    首先下载oxygen软件(Oxygen XML Editor),目前使用的是试用版(可以安装好软件以后get trial licence,获得免费使用30天的权限,当然这里鼓励大家用正版软件!!!) ...

  8. Android Fragment StartActivityForresult调用实例

    fragment里面的onActivityResult 怎样才能被调用,很简单,就一句话, startActivityForResult(intent, getActivity().RESULT_FI ...

  9. [LeetCode]题解(python):154-Find Minimum in Rotated Sorted Array II

    题目来源: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 题意分析: 给定一个有重复的翻转的数组,找到最 ...

  10. Scala类型声明与定义、函数定义、流程控制、异常处理

    Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. Scala的基础类型基本与javascript一致. Scala的数据类型全部相同于Java中,具有 ...