【bzoj3261】最大异或和 可持久化Trie树
题目描述
给定一个非负整数序列 {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树相关推荐
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- P4735 最大异或和 可持久化trie树
可持久化01trie类似主席树思想 但是不支持版本差(也可以加一个siz 做差) 只能再维护一个左端点的最大值即可 #include<bits/stdc++.h> using ...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...
- 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 ...
- HDU - 4757 Tree(LCA+可持久化trie树)
题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析 ...
- BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)
#3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...
- 省选专练(学习)可持久化Trie树(BZOJ3261)
这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...
- BZOJ 3261: 最大异或和 [可持久化Trie]
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1513 Solved: 657 [Submit][Status][Disc ...
最新文章
- 从搜索引擎到社交网络的艰难转变
- java 变成题_Java 习题8 参考答案及解析
- 计算机音乐植物大战僵尸泳池,植物大战僵尸(泳池)
- 0626 Django模型(ORM)
- AI学习笔记(三)特征选择与提取、边缘提取
- 命令行参数解析函数 getopt
- 极速办公(word)如何文字居中
- 【考研日记1】:看到2016年数学考的如此之难后
- 现货白银最低门槛是啥?
- 计算机蓝屏解决,电脑蓝屏怎么解决,详细解决蓝屏方案
- 时钟、背景音乐、背景图片
- 1156针最强cpu,1156的CPU什么最好?
- Java中的深浅拷贝方式
- Entry name *.xml collided终极解决方案
- html5 案例练习(注册页面)
- 倪妮、金钟仁倾情演绎古驰2020秋冬眼镜广告形象大片
- 桌面应用程序的版本更新,升级
- C#版网络对战五子棋以及Socket通信
- hadoop分布式环境搭建
- 《用MQL4编程》读书笔记(1)
热门文章
- Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
- 如何为ccflow工作流引擎增加一个优先级PRI?
- WinCE6.0 修改开机Logo方法集锦(二)
- 获取局域网打印机列表
- html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...
- 桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五
- 我对Node.js Core的首次贡献中学到了什么
- 微信公众号开发本地环境开发_如何在5分钟内使HTTPS在本地开发环境上工作
- h3c交换机端口加入vlan命令_华为交换机批量加入 Vlan 方法
- python文件句柄_Python文件操作