BZOJ 3166 set+可持久化trie树(OR 莫队)
思路:
1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1
2.用可持久化trie树找异或最大值
也可以用莫队
//By SiriusRen
#include <set>
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 50050
int n,cnt,f,ch[N*32][2],wei[N*32],root[N];
int begin,end,ans;
void insert(int last,int num){int now=cnt;for(int i=30;i>=0;i--){f=num&(1<<i)?1:0;ch[now][f]=++cnt,ch[now][!f]=ch[last][!f];now=ch[now][f],last=ch[last][f];wei[now]=wei[last]+1;}
}
int query(int x,int y,int num){int temp=0;for(int i=30;i>=0;i--){f=num&(1<<i)?0:1;if(wei[ch[y][f]]-wei[ch[x][f]]>0)x=ch[x][f],y=ch[y][f],temp+=(1<<i);else x=ch[x][!f],y=ch[y][!f];}return temp;
}
struct Node{int id,w;}a[N];
bool operator<(Node a,Node b){return a.w>b.w;}
set<int>st;
set<int>::iterator it1,it2;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i].w),a[i].id=i;root[i]=++cnt;insert(root[i-1],a[i].w);}st.insert(-1),st.insert(-2),st.insert(N),st.insert(n+1);sort(a+1,a+1+n),st.insert(a[1].id);for(int i=2;i<=n;i++){st.insert(a[i].id);it2=st.lower_bound(a[i].id);it1=it2,it2++,it2++,it1--,it1--;begin=max(1,*it1+1),end=min(n,*it2-1);ans=max(ans,query(root[begin-1],root[end],a[i].w));}printf("%d\n",ans);
}
莫队(是稍微慢一些的……):
//By SiriusRen
#include <set>
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 50050
int n,cnt=1,b[N],f,ch[N*32][2],wei[N*32],root[N];
int begin,end,ans,tot;
struct Node{int id,w;}a[N];
bool operator<(Node a,Node b){return a.w>b.w;}
set<int>st;
set<int>::iterator it1,it2;
struct Ask{int l,r,w;}ask[N];
bool operator<(Ask a,Ask b){return a.l<b.l;}
void insert(int x,int w){int now=1;for(int i=30;i>=0;i--){f=x&(1<<i)?1:0;if(!ch[now][f])ch[now][f]=++cnt;now=ch[now][f],wei[now]+=w;}
}
int query(int num){int now=1,temp=0;for(int i=30;i>=0;i--){f=num&(1<<i)?0:1;if(ch[now][f]&&wei[ch[now][f]])temp+=(1<<i),now=ch[now][f];else now=ch[now][!f];}return temp;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&b[i]),a[i].w=b[i],a[i].id=i;st.insert(-1),st.insert(-2),st.insert(N),st.insert(n+1);sort(a+1,a+1+n),st.insert(a[1].id);for(int i=2;i<=n;i++){st.insert(a[i].id);it2=st.lower_bound(a[i].id);it1=it2,it2++,it2++,it1--,it1--;begin=max(1,*it1+1),end=min(n,*it2-1);ask[++tot].l=begin-1,ask[tot].r=end,ask[tot].w=a[i].w;}sort(ask+1,ask+1+tot);for(int i=1,l=1,r=0;i<=tot;i++){while(r<ask[i].r)insert(b[r+1],1),r++;while(r>ask[i].r)insert(b[r],-1),r--;while(l<ask[i].l)insert(b[l],-1),l++;while(l>ask[i].l)insert(b[l-1],1),l--;ans=max(ans,query(ask[i].w));}printf("%d\n",ans);
}
转载于:https://www.cnblogs.com/SiriusRen/p/6532082.html
BZOJ 3166 set+可持久化trie树(OR 莫队)相关推荐
- BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)
#3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- 【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 ...
- 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的异或值最大,输出异或值 题目分析 ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 省选专练(学习)可持久化Trie树(BZOJ3261)
这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- P4735 最大异或和 01可持久化Trie树模板
原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...
最新文章
- lisp语言cond和if套用_在'if'语句中设置多行条件的样式?
- MPEG简介 + 如何计算CBR 和VBR的MP3的播放时间
- 综艺节目php灭灯_非诚勿扰php程序员 结果遭女嘉宾瞬间全灭灯
- 从Mysql slave system lock延迟说开去
- mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
- linux setuid函数_setuid函数解析
- Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
- 深入了解Delphi 7中的四种消息框
- 设计师职场提升效率品质素材网,一个足矣
- OpenShift 4之访问权限分级授权
- 17ー03ー20 日本語勉強
- Electron使用nodejs的坑,Can‘t resolve ‘child_process‘错误
- PDF编辑软件哪个好 如何裁剪PDF文件页面
- 如何安装 Simscape Multibody Link
- niosii spi 外部_niosii 的SPI详解
- android 8.0手机无法更新版本,微信8.0安卓机怎么安装更新 安卓微信更新不了8.0解决办法一览...
- 【荔枝派zero】usb虚拟串口实现
- RK3566和S905X3/S905X4对比哪个好?
- 从此就学会了...笑着哭......
- 购物车的实现(jsp+servlet)