思路:
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 莫队)相关推荐

  1. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

    #3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...

  2. BZOJ 3261 最大异或和 可持久化Trie树

    题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...

  3. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  4. 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 ...

  5. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  6. HDU - 4757 Tree(LCA+可持久化trie树)

    题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析 ...

  7. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  8. 省选专练(学习)可持久化Trie树(BZOJ3261)

    这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...

  9. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  10. P4735 最大异或和 01可持久化Trie树模板

    原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...

最新文章

  1. lisp语言cond和if套用_在'if'语句中设置多行条件的样式?
  2. MPEG简介 + 如何计算CBR 和VBR的MP3的播放时间
  3. 综艺节目php灭灯_非诚勿扰php程序员 结果遭女嘉宾瞬间全灭灯
  4. 从Mysql slave system lock延迟说开去
  5. mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
  6. linux setuid函数_setuid函数解析
  7. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
  8. 深入了解Delphi 7中的四种消息框
  9. 设计师职场提升效率品质素材网,一个足矣
  10. OpenShift 4之访问权限分级授权
  11. 17ー03ー20 日本語勉強
  12. Electron使用nodejs的坑,Can‘t resolve ‘child_process‘错误
  13. PDF编辑软件哪个好 如何裁剪PDF文件页面
  14. 如何安装 Simscape Multibody Link
  15. niosii spi 外部_niosii 的SPI详解
  16. android 8.0手机无法更新版本,微信8.0安卓机怎么安装更新 安卓微信更新不了8.0解决办法一览...
  17. 【荔枝派zero】usb虚拟串口实现
  18. RK3566和S905X3/S905X4对比哪个好?
  19. 从此就学会了...笑着哭......
  20. 购物车的实现(jsp+servlet)

热门文章

  1. 苹果mac预览应用使用方法
  2. iOS开发计算工程里面的代码行数
  3. 静态反编译工具IDA Pro 7 for Mac
  4. ORACLE数据恢复方法(提交事务也可以)
  5. python -- 装饰器的高级应用
  6. JavaScript中常见的字符串操作函数及用法
  7. 云主机前景几何,风萧萧兮!
  8. web容器 Spring容器 SpringMVC容器 的关系
  9. 处理 Exception 的几种实践,很优雅,已被很多团队采纳!
  10. Flink技术到底是什么?Flink原理及深度解析