BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树
3261: 最大异或和
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 3519 Solved: 1493
[Submit][Status][Discuss]
Description
Input
第一行包含两个整数 N ,M,含义如问题描述所示。
第二行包含 N个非负整数,表示初始的序列 A 。
接下来 M行,每行描述一个操作,格式如题面所述。
Output
假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。
Sample Input
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保证没有修改操作。
0<=a[i]<=10^7。
Sample Output
5
6
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=6e5; int son[maxn<<][],sum[maxn<<],root[maxn],ret[maxn],sz=;
//son每个节点指向的两个节点的位置,sum每个节点出现的次数,root每棵01Trie根节点的位置 void insert(int val,int &x,int pre)
{
x=++sz;int t=x;
for(int i=;i>=;i--){
son[t][]=son[pre][];son[t][]=son[pre][];
sum[t]=sum[pre]+;
int j=(val>>i)&;
son[t][j]=++sz;//新开的节点
t=son[t][j];pre=son[pre][j];
}
sum[t]=sum[pre]+;
} int query(int val,int x,int y)
{
int ans=;
for(int i=;i>=;i--){
int j=(val>>i)&;
if(sum[son[y][j^]]-sum[son[x][j^]]>){
ans+=(<<i);
x=son[x][j^];y=son[y][j^];
}
else{
x=son[x][j];y=son[y][j];
}
}
return ans;
} int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
insert(ret[],root[],root[]);
for(int i=;i<=n+;i++){
scanf("%d",&x);
ret[i]=ret[i-]^x;
insert(ret[i],root[i],root[i-]);
}
int h=n+;
while(m--){
char op[];
scanf("%s",op);
if(op[]=='A'){
scanf("%d",&x);
++h;
ret[h]=ret[h-]^x;
insert(ret[h],root[h],root[h-]);
}
else{
int l,r;
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",query(ret[h]^x,root[l-],root[r]));
}
}
return ;
}
圆润的走开了。。。
BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树的更多相关文章
- 可持久化01Trie树【p4735(bzoj3261)】最大异或和
Description 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N ...
- BZOJ 3261: 最大异或和( 可持久化trie )
搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- BZOJ 3261: 最大异或和
Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...
- bzoj 3261 最大异或和 可持久化字典树(01树)
题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...
- 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key 2 秒 262,144 KB 160 分 6 级题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...
随机推荐
- UVA 1645 Count
https://vjudge.net/problem/UVA-1645 题意:有多少个n个节点的有根树,每个深度中所有节点的子节点数相同 dp[i] 节点数为i时的答案 除去根节点还有i-1个点,如果 ...
- LightOJ 1375 - LCM Extreme 莫比乌斯反演或欧拉扩展
题意:给出n [1,3*1e6] 求 并模2^64. 思路:先手写出算式 观察发现可以化成 那么关键在于如何求得i为1~n的lcm(i,n)之和.可以知道lcm(a,b)为ab/gcd(a,b) 变换 ...
- Nginx完整配置配置样例
nginx.conf user www www; ## Default: nobody worker_processes 5; ## Default: 1 error_log logs/error.l ...
- 省队集训Day1 睡觉困难综合征
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...
- windows 上启动appium
import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecuteResultHandl ...
- python中multiprocessing模块
multiprocess模块那来干嘛的? 答:利用multiprocessing可以在主进程中创建子进程.Threading是多线程,multiprocessing是多进程. #该模块和Threadi ...
- python基础===monkeytype可以自动添加注释的模块!
monkeytype 一个可以自动添加注释的模块! 先要下载: pip install monkeytype 以官网的sample code为例 #moudle.py def add(a, b): r ...
- 跟踪内核启动过程CONFIG_DEBUG_LL【转自】
转自:http://bbs.chinaunix.net/thread-3642079-1-1.html 最近在调试Linux内核,跟踪启动过程.发现在没有turn on mmu之前,可以使用物理地址, ...
- C# 数组 随机 排序
]; ; i < ; i++) { arrInt[i] = i; } arrInt = arrInt.OrderBy(c => Guid.NewGuid()).ToArray<int ...
- UCenter创始人、Discuz!创始人、管理员账号的认知(转)
UCenter创始人.Discuz!创始人.管理员账号的认知 什么是创始人?现在可能还有好多的站长对这个概念有点模糊,今天我给大家屡屡思路,讲讲这个概念性问题,没啥技术含量.已经明白这个概 ...