P4735 最大异或和 01可持久化Trie树模板
原题:https://www.luogu.org/problemnew/show/P4735
题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r],就是区间对一个数的异或的最最大值。假设我们把这个区间放进Trie字典树中,对于一个x的询问,可以用贪心的思想,反着走找到最大值。但是确定出给定区间的Trie树,用类似于主席树的思想,建一颗动态开点的Trie树,询问时用前缀和减掉就行了。洛谷的评测很神奇,不开o2过不了。
#include<bits/stdc++.h>
#define reg register
using namespace std;
const int N=600010;
int ch[N*30][2],cnt[N*30],T[N];
int n,m,s[N],tot;
char str[10];
inline int rd(){int x=0;int f=1;char s=getchar();while(!isdigit(s)) f=(s=='-'?-1:f),s=getchar();while(isdigit(s)) x=(x<<1)+(x<<3)+s-'0',s=getchar();return x*f;
}
void ins(int a,int b,int t,int x){if(t<0) return ;int i=(x>>t)&1; ch[a][!i]=ch[b][!i];ch[a][i]=++tot;cnt[ch[a][i]]=cnt[ch[b][i]]+1;ins(ch[a][i],ch[b][i],t-1,x);
}
int query(int a,int b,int t,int x){if(t<0) return 0;int i=(x>>t)&1;if(cnt[ch[b][!i]]>cnt[ch[a][!i]]) return (1<<t)+query(ch[a][!i],ch[b][!i],t-1,x);else return query(ch[a][i],ch[b][i],t-1,x);
}
inline void print(int x){if(x==0) {puts("0");return ;} if(x<0) {putchar('-');x=0-x;}int d[30],now=-1;while(x) d[++now]=x%10,x/=10;for(int i=now;i>=0;i--) putchar('0'+d[i]);puts("");}
int main(){
// freopen("p4735.in","r",stdin);n=rd();m=rd();T[0]=++tot;ins(T[0],0,25,0);for(int i=1;i<=n;i++){s[i]=rd();s[i]^=s[i-1]; T[i]=++tot;ins(T[i],T[i-1],25,s[i]);} for(int i=1;i<=m;i++){scanf("%s",&str);int x,l,r;if(str[0]=='A'){s[++n]=rd();s[n]^=s[n-1];T[n]=++tot;ins(T[n],T[n-1],25,s[n]);}else{l=rd()-1;r=rd()-1;x=rd();int ans=0;if(l==0) ans=query(0,T[r],25,x^s[n]);//else ans=query(T[max(0,l-1)],T[r],25,x^s[n]);print(ans);}}return 0;
}
P4735 最大异或和 01可持久化Trie树模板相关推荐
- 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 ...
- P4735 最大异或和(可持久化字典树)
题目链接:P4735 最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型: 1 .A x:添加操作,表示在序列末尾添加一个数 x, ...
- P4735 最大异或和(可持久化字典树 ? 主席树)
异或满足可减性,所以可以维护前缀和,然后 a[p] xor a[p + 1] xor ... xor a[n] xor = s[p - 1] xor s[n] xor然后就只要维护s[].添加很好维护 ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...
- 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]最大 首先我们能够维护前缀和 然后 ...
- HDU - 4757 Tree(LCA+可持久化trie树)
题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析 ...
最新文章
- 在代码中获取ApplicationContext实例
- Linux shell test用法
- Android使用ActivityGroup设置android:windowSoftInputMode失效的问题
- jvm性能调优 - 20G1垃圾回收器应该如何设置参数
- 用Go语言建立一个简单的区块链part2:Pow共识
- 感谢前任程序员赏饭吃!
- 工程师们在摔倒后如何不尴尬
- Cesium:点击实体后在实体上方添加div,并随地球转动不断更新位置
- db2与mysql语法区别_db2和mysql语法的区别是什么
- sap的工作日历_ABAP-有关日期的SAP函数使用(日历)
- SPSS:主成分分析确定不同指标权重
- 加性噪声(目前不理解)
- 单片机及开发板的介绍
- 打印机无法访问计算机,打印机拒绝访问,详细教您打印机拒绝访问无法连接怎么解决...
- 浏览器默认主页被篡改(chrome,IE)
- 一文搞懂「微信支付 Api-v3」接口规则所有知识点
- java解析ceb文件_读取文件夹内容解析为Tree结构
- 安卓期末大作业——Android水果连连看
- html读写Mysql数据库
- html表白画画,超可爱·少女心·表白简笔画:我喜欢你,你就得跟我在一起!