搞成前缀和然后就可以很方便地用可持久化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. mac itunes ios 7 升级 出现 this device isn't eligible for the requested build

    今天在对我的iPod 进行iOS7 升级的时候(在mac iTunes 上进行的),一直弹出框提示 解决办法就是 1. 打开HOSTS (Mac 下路径为:/etc/hosts, 至于怎么打开host ...

  2. 【转】HtmlAgilityPack 之 HtmlNode类

    [转]HtmlAgilityPack 之 HtmlNode类 HtmlAgilityPack中的HtmlNode类与XmlNode类差不多,提供的功能也大同小异.下面来看看该类提供功能. 一.静态属性 ...

  3. winform CheckedListBox实现全选/全不选

    /全选         private void button3_Click(object sender, EventArgs e)         {             for (int i ...

  4. 一个很好的用C#导出数据到Excel模板的方法

    /// <summary> /// 导数据到Excel模板 /// </summary> /// <param name="tab">要输出内容 ...

  5. C# - 自定义 DataSet 的使用

    -------------------------------------------------  SellProdectManager.cs  -------------------------- ...

  6. poco vs Boost[ZZ]

    http://wooce.iteye.com/blog/634395 POCO的优点: 1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级. 2) 比 boost:a ...

  7. JPA 2.1实例(hibernate 实现)

    1.环境准备 1)java se 7 2)maven 3 3)mysql database 2.创建数据库和表结构 首先创建数据库.创建数据库脚本如下: create database jpa; 创建 ...

  8. Android GridView(九宫图)

    GridView跟ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选! <?xml version="1.0" encoding="u ...

  9. Git存储用户名和密码(明文需谨慎)

    当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只需在下 ...

  10. 【转】MUD教程--巫师入门教程2

    简单的人物原则上只要有 set_name<名字> . combat_exp <经验>就行了,当然我们总得稍微多添一点了.inherit NPC;void create(){ s ...