省选专练(学习)可持久化Trie树(BZOJ3261)
这个似乎也不是好难啊
但是可持久化Trie还是可以干许多线性基不能干的事。
什么是可持久化Trie?
顾名思义:是一种可以持久化的Trie树
他的建树方式和键值式线段树方式类似
也支持版本的减法
查询的本质是贪心:
利用版本减法判断第K位上的Trie值是不是成立
以此向下查询
#include<bits/stdc++.h>
using namespace std;
inline void read(int &x){x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
const int N=6e5+100;
int bin[30]={};
int root[N]={};
struct Trie{int sum[N*24];int ch[N*24][2];int cnt;inline int insert(int x,int val){int tmp=++cnt;int y=cnt;for(int i=23;i>=0;i--){ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];sum[y]=sum[x]+1;int t=val&(bin[i]);t>>=i;x=ch[x][t];ch[y][t]=++cnt;y=ch[y][t];}sum[y]=sum[x]+1;return tmp;}inline int query(int l,int r,int val){int tmp=0;for(int i=23;i>=0;i--){int t=val&(bin[i]);t>>=i;if(sum[ch[r][t^1]]-sum[ch[l][t^1]]){tmp+=bin[i];r=ch[r][t^1];l=ch[l][t^1];}else l=ch[l][t],r=ch[r][t];} return tmp;}
}T;
int n,m;
int A[N]={};
int B[N]={};
int main(){
// freopen("bzoj3261.in","r",stdin);
// freopen("bzoj3261.out","w",stdout);read(n);read(m);bin[0]=1;for(int i=1;i<=23;i++)bin[i]=bin[i-1]*2;n++;for(int i=2;i<=n;i++)read(A[i]);for(int i=1;i<=n;i++)B[i]=B[i-1]^A[i];for(int i=1;i<=n;i++){
// cout<<B[i]<<'\n';root[i]=T.insert(root[i-1],B[i]);}
// cout<<query(root[1],root[n],0)<<'\n';for(int i=1;i<=m;i++){char opt[2];scanf("%s",opt);if(opt[0]=='A'){int x;n++;read(x);B[n]=B[n-1]^x;root[n]=T.insert(root[n-1],B[n]); }else{int l,r,x;read(l);read(r);read(x);cout<<T.query(root[l-1],root[r],B[n]^x)<<'\n';}
// cout<<i<<" "<<'\n';}return 0;
}
转载于:https://www.cnblogs.com/Leo-JAM/p/10079191.html
省选专练(学习)可持久化Trie树(BZOJ3261)相关推荐
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...
- 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 ...
- 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个操作,有以下两种操作类 ...
- 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 ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 省选专练(学习)AC自动机
我好菜啊 AC自动机都不会 AC自动机可以干什么: 用一个模板串匹配多个子串. 这便让AC自动机可以干许多KMP和Tri树不能干的事. AC自动机的构造 首先建立一颗Trie树. 其次利用KMP的思想 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
最新文章
- do_exit——exit_notify()【转】
- Android JNI入门第六篇——基本数据类型使用
- SQL SERVER 2005 CTE(通用表达式)
- 图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺
- html加javascript和canvas类似超级玛丽游戏
- dubbo启动时检查服务
- css3宽度变大动画_动画演示流量计的工作原理
- Python爬虫--- 1.2 BS4库的安装与使用
- 基于R语言实现的交通时空大数据处理
- Meteor的工作原理及优势与不足
- WiFi音箱在国内普及需解决的三点
- python统计pdf字数代码_Python基本数据统计.pdf
- 计算机驱动程序属于系统还是软件,什么是VGA驱动程序?
- php oa系统 缺点,PHPOA:被低估的OA自动化系统
- 波士顿房价预测(一)
- Unity 坐标转换
- Vue插件报错:Vue.js is detected on this page.
- Vim插件之vim-autoformat
- imgproc/src/morph.simd.hpp:756: error:(-213:The function/feature is not implemented)解决方案
- 爱奇艺QA测试环境管理平台初探