题目描述

给定一个非负整数序列 {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 最大,输出最大是多少。

输入

第一行包含两个整数 N  ,M,含义如问题描述所示。   
第二行包含 N个非负整数,表示初始的序列 A 。 
接下来 M行,每行描述一个操作,格式如题面所述。

输出

假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。

样例输入

5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6

样例输出

4
5
6


题解

可持久化Trie树

由于x xor x=0,所以$a_p\oplus a_{p+1}\oplus \cdots\oplus a_{n-1}\oplus a_n\oplus x=(a_1\oplus a_2\oplus\cdots\oplus a_{p-2}\oplus a_{p-1})\oplus(a_1\oplus a_2\oplus\cdots\oplus a_{n-1}\oplus a_{n})\oplus x$

维护一个前缀异或和,则这里的sum[n] xor x是已知的,只要求出是这个值最大的sum[p-1]。

因为100000(2)>011111(2),所以可以把前缀和放到可持久化Trie树中,然后贪心求解。

这里需要注意的是l可能等于1,会使用到sum[0],而建立可持久化Trie树时就要用到root[-1],所以把整个数组向右平移一位。

#include <cstdio>
#include <algorithm>
#define N 600010
using namespace std;
int sum[N] , next[N * 20][2] , si[N * 20] , tot , root[N];
char str[5];
int insert(int x , int v)
{int tmp , y , i;bool t;tmp = y = ++tot;for(i = 1 << 24 ; i ; i >>= 1){next[y][0] = next[x][0] , next[y][1] = next[x][1] , si[y] = si[x] + 1;t = v & i , x = next[x][t] , next[y][t] = ++tot , y = next[y][t];}si[y] = si[x] + 1;return tmp;
}
int query(int x , int y , int v)
{int ret = 0 , i;bool t;for(i = 1 << 24 ; i ; i >>= 1){t = v & i;if(si[next[y][t ^ 1]] - si[next[x][t ^ 1]]) ret += i , x = next[x][t ^ 1] , y = next[y][t ^ 1];else x = next[x][t] , y = next[y][t];}return ret;
}
int main()
{int n , m , i , x , y , z;scanf("%d%d" , &n , &m) , n ++ ;for(i = 2 ; i <= n ; i ++ ) scanf("%d" , &x) , sum[i] = sum[i - 1] ^ x;for(i = 1 ; i <= n ; i ++ ) root[i] = insert(root[i - 1] , sum[i]);while(m -- ){scanf("%s%d" , str , &x);if(str[0] == 'A') n ++ , sum[n] = sum[n - 1] ^ x , root[n] = insert(root[n - 1] , sum[n]);else scanf("%d%d" , &y , &z) , printf("%d\n" , query(root[x - 1] , root[y] , sum[n] ^ z));}return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7061360.html

【bzoj3261】最大异或和 可持久化Trie树相关推荐

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

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

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

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

  3. P4735 最大异或和 可持久化trie树

    可持久化01trie类似主席树思想    但是不支持版本差(也可以加一个siz 做差)    只能再维护一个左端点的最大值即可 #include<bits/stdc++.h> using ...

  4. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  5. P4735 最大异或和(可持久化trie树、求最大区间异或和)

    P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...

  6. HDU - 4757 Tree(LCA+可持久化trie树)

    题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析 ...

  7. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

    #3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...

  8. 省选专练(学习)可持久化Trie树(BZOJ3261)

    这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...

  9. BZOJ 3261: 最大异或和 [可持久化Trie]

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1513  Solved: 657 [Submit][Status][Disc ...

最新文章

  1. 从搜索引擎到社交网络的艰难转变
  2. java 变成题_Java 习题8 参考答案及解析
  3. 计算机音乐植物大战僵尸泳池,植物大战僵尸(泳池)
  4. 0626 Django模型(ORM)
  5. AI学习笔记(三)特征选择与提取、边缘提取
  6. 命令行参数解析函数 getopt
  7. 极速办公(word)如何文字居中
  8. 【考研日记1】:看到2016年数学考的如此之难后
  9. 现货白银最低门槛是啥?
  10. 计算机蓝屏解决,电脑蓝屏怎么解决,详细解决蓝屏方案
  11. 时钟、背景音乐、背景图片
  12. 1156针最强cpu,1156的CPU什么最好?
  13. Java中的深浅拷贝方式
  14. Entry name *.xml collided终极解决方案
  15. html5 案例练习(注册页面)
  16. 倪妮、金钟仁倾情演绎古驰2020秋冬眼镜广告形象大片
  17. 桌面应用程序的版本更新,升级
  18. C#版网络对战五子棋以及Socket通信
  19. hadoop分布式环境搭建
  20. 《用MQL4编程》读书笔记(1)

热门文章

  1. Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
  2. 如何为ccflow工作流引擎增加一个优先级PRI?
  3. WinCE6.0 修改开机Logo方法集锦(二)
  4. 获取局域网打印机列表
  5. html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...
  6. 桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五
  7. 我对Node.js Core的首次贡献中学到了什么
  8. 微信公众号开发本地环境开发_如何在5分钟内使HTTPS在本地开发环境上工作
  9. h3c交换机端口加入vlan命令_华为交换机批量加入 Vlan 方法
  10. python文件句柄_Python文件操作