BZOJ3261:最大异或和
浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3261
假设现在所有数的异或和是\(xor\_sum\),\(sum\_xor[i]\)表示前\(i\)个数的异或和,那么每次询问可以转化成:
在区间\([l-1,r-1]\)里面找一个\(sum\_xor_i\),使得\(sum\_xor_i\oplus x\oplus xor\_sum\)最大值。
我们已经知道了\(x\oplus xor\_sum\)的值,只需要按照每一位去贪心地找\(sum\_xor_i\)的合适的值就行了。
由于是在区间内找有没有某一位存在我想要的,显然就能想到可持久化了。
时间复杂度:\(O((n+m)*24)\)
空间复杂度:\(O((n+m)*24)\)
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=3e5+5;
char s[5];
int rt[maxn<<1];
int cnt,n,m,xor_sum;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct Trie {
int tot;
struct node {
int sum;
int son[2];
}p[maxn*48];
void ins(int lst_id,int id,int v) {
int lst=rt[lst_id],u;
u=rt[id]=++tot;
for(int i=24;~i;i--) {
int c=v>>i&1;
p[u].son[c]=++tot;
u=p[u].son[c],lst=p[lst].son[c];
p[u]=p[lst];p[u].sum++;
}
}
void make_ans(int u2,int u1,int v) {
int ans=0;
for(int i=24;~i;i--) {
int c=v>>i&1;
int sum=p[p[u1].son[c^1]].sum;
sum-=p[p[u2].son[c^1]].sum;
if(!sum)ans=ans<<1,u1=p[u1].son[c],u2=p[u2].son[c];
else ans=ans<<1|1,u1=p[u1].son[c^1],u2=p[u2].son[c^1];
}
printf("%d\n",ans);
}
}T;
int main() {
cnt=n=read(),m=read();
for(int i=1;i<=n;i++) {
int x=read();xor_sum^=x;
T.ins(i-1,i,xor_sum);
}
for(int i=1;i<=m;i++) {
scanf("%s",s+1);
if(s[1]=='A') {
int x=read();xor_sum^=x,cnt++;
T.ins(cnt-1,cnt,xor_sum);
}
else {
int l=read(),r=read(),x=read();
if(r==1) {printf("%d\n",x^xor_sum);continue;}
T.make_ans(rt[max(0,l-2)],rt[r-1],x^xor_sum);
}
}
return 0;
}
BZOJ3261:最大异或和的更多相关文章
- bzoj3261: 最大异或和
可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...
- ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...
- BZOJ3261最大异或和——主席树
题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p ...
- bzoj3261: 最大异或和 可持久化trie
题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
- 2018.08.04 bzoj3261: 最大异或和(trie)
传送门 简单可持久化01trie树. 实际上这东西跟可持久化线段树貌似是一个东西啊. 要维护题目给出的信息,就需要维护前缀异或和并且把它们插入一棵01trie树,然后利用贪心的思想在上面递归就行了,因 ...
- bzoj3261: 最大异或和 (可持久化trie树)
题目链接 题解 看到异或和最大就应该想到01 trie树 我们记\(S_i\)为前i项的异或和 那么我们的目的是最大化\(S_n\)^\(x\)^\(S_{j-1}\) \((l <= j &l ...
- 【可持久化Trie】bzoj3261 最大异或和
对原序列取前缀异或值,变成pre[1...N],然后询问等价于求max{a[N]^x^pre[i]}(l-1<=i<=r-1). #include<cstdio> #defin ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...
- BZOJ3261 最大异或和 【可持久化trie树】
题目 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
随机推荐
- CGLIB介绍与原理
转载: http://blog.csdn.net/zghwaicsdn/article/details/50957474 CGLIB介绍与原理(部分节选自网络) 一.什么是CGLIB? CGLIB是一 ...
- GPON命令模式
1.添加ont步骤 1.1 查看自动发现的ONT,并记录SN号和PON口 MA5680T(config)#display ont autofind all --------------------- ...
- redisAPI整理
全局命令 1.查看所有键 keys * 2.键总数 dbsize 3.检查键是否存在 exists key 4.删除键 del key del key1 key2 key3 5.键过期 expire ...
- 快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1
112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural num ...
- 【zznu-夏季队内积分赛3-G】2333
题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以EOF结尾,每行一个数字 ...
- bfs+状态压缩dp
题目连接 题解 : 对两两管道进行bfs,然后用dp[i][j] 来表示在i状态下通过了前j个管道 参考博客 #include<bits/stdc++.h> using namespace ...
- Linux:grub密码设置与修改
grub密码设置与修改 默认GRUB启动参数可以的进入单用户模式从而修改root密码,如果想要给GRUB菜单设置密码,可以修改/etc/grub.conf文件 (/boot/grub/grub.con ...
- 用angularjs的$http提交的数据,在php服务器端却无法通过$_REQUEST/$_POST获取到
- Android 4.0 Camera架构分析之Camera初始化
Android Camera 采用C/S架构,client 与server两个独立的线程之间使用Binder通信,这已经是众所周知的了.这里将介绍Camera从设备开机,到进入相机应用是如何完成初始化 ...
- 【sklearn】性能度量指标之ROC曲线(二分类)
原创博文,转载请注明出处! 1.ROC曲线介绍 ROC曲线适用场景 二分类任务中,positive和negtive同样重要时,适合用ROC曲线评价 ROC曲线的意义 TPR的增长是以FPR的增长为代价 ...