题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解

(这题意有点别扭)

异或这种套路,一般都是上trie,区间异或就加个可持久化

但问题是怎么找区间

不妨令每一个\(a_i\)为当前区间的次大值,那我们的目标就是尽可能找出该次大值的最远左右边界

令\(a_i\)从大到小插入,使用平衡树动态维护位置,那么\(pos_i\)的前驱和后继都是比\(a_i\)大的值的下标

假设第一个比\(a_i\)大的左边界下标是\(L1\),第二个比它大的是\(L2\),既\(L2<L1\)

同理设\(R2>R1\)

那么符合条件的极大区间就是\([L1+1,R2-1]\)和\([L2+1,R1-1]\)

对于字典树上求异或最大值并不需要严格区分两个极大区间,那么我们直接求出\([L2+1,R2-1]\)的异或最大值即可

PS.这回代码写着有点飘

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iter(i,j) for(int i=0;i<(j).size();i++)
#define print(a) printf("%lld",(ll)a)
#define println(a) printf("%lld\n",(ll)a)
#define printbk(a) printf("%lld ",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int MAXN = 5e4+11;
const int oo = 0x3f3f3f3f;
typedef long long ll;
ll read(){
ll x=0,f=1;register 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();}
return x*f;
}
int T[MAXN],a[MAXN],b[MAXN];
struct TRIE{
int tot;
int son[MAXN*35][2],size[MAXN*35];
void init(){
tot=0;
son[0][0]=son[0][1]=size[0]=0;
memset(T,0,sizeof T);
}
int insert(int old,int val){
int rt,o;rt=o=++tot;
rrep(i,30,0){
son[o][0]=son[old][0],
son[o][1]=son[old][1];
size[o]=size[old]+1;
int wh=val>>i&1;
son[o][wh]=++tot;
old=son[old][wh];
o=son[o][wh];
}
size[o]=size[old]+1;
return rt;
}
int query(int l,int r,int val){
int ans=0;
rrep(i,30,0){
int wh=val>>i&1;
if(size[son[r][wh^1]]-size[son[l][wh^1]]){
ans|=(1<<i),r=son[r][wh^1],l=son[l][wh^1];
}else{
r=son[r][wh],
l=son[l][wh];
}
}
return ans;
}
}trie;
struct QAQ{
int pos;ll val;
bool operator<(const QAQ &ORZ)const{
return val>ORZ.val;
}
}c[MAXN];
int main(){
int n,m;
while(cin>>n){
trie.init();
rep(i,1,n) c[i]=(QAQ){i,read()};
rep(i,1,n) T[i]=trie.insert(T[i-1],c[i].val);
set<int> s;
int orz[]={-1,-2,-3,oo,oo+1,oo+2};
rep(i,0,5) s.insert(orz[i]);
sort(c+1,c+1+n);
int ans=0;
rep(i,1,n){
int l,r,now;;
s.insert(l=r=now=c[i].pos);
if(i==1) continue;
set<int>::iterator it,old;
it=old=s.find(now);
it--;it--; l=(*it)+1;
it=old;
it++;it++; r=(*it)-1;
l=max(1,l);r=min(r,n);
ans=max(ans,trie.query(T[l-1],T[r],c[i].val));
}
println(ans);
}
return 0;
}

BZOJ - 3166 可持久化Trie 维护次大区间的更多相关文章

  1. bzoj 2741 可持久化trie

    首先我们设si为前i个数的xor和,那么对于询问区间[i,j]的xor和,就相当于si-1^sj,那么对于这道题的询问我们可以处理处si,然后对于询问[l,r],可以表示为在区间[l-1,r]里找两个 ...

  2. bzoj 3166 可持久化Tire

    每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...

  3. BZOJ 3261: 最大异或和( 可持久化trie )

    搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...

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

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

  5. bzoj 3261: 最大异或和 (可持久化trie树)

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Description       给定一个非负整数序列 {a},初始长度为 N.       ...

  6. 可持久化trie 学习总结

    QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...

  7. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

  8. bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)

    内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...

  9. 2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)

    问题 I: qwb VS 去污棒 时间限制: 2 Sec  内存限制: 256 MB 提交: 74  解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底 ...

随机推荐

  1. chrome crx下载路径

    chrome crx下载后会被删除,可在检查时粘贴出来,下载路径在: %localappdata%\Google\Chrome\User Data\Webstore Downloads 参考:http ...

  2. 在linux下使用CMake构建应用程序

    本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...

  3. [GO]空接口

    package main import "fmt" //空接口的实际意义就在于在使用函数时,空接口可以接收任意类型的值,类似于python中的*args, **kwargs fun ...

  4. django model ValueQuerySet QuerySet 转换成JSON

    这里我有4个字段需要使用外键,那么在调取数据的时候就可以使用两个'_'进行调取,当然条件必须需要从前端传进来 models.py class HostInfo(models.Model): host_ ...

  5. Git & Github使用总结

    Linux下git的安装 在终端下输入 git , 看系统有没有安装git. 如果没有安装则会出现以下提醒: The program 'git' is currently not installed. ...

  6. SurfaceView实时绘图,视频流

  7. ArcGIS API for Javascript 图层切换渐变效果实现

    在一个WebGIS系统中往往要实现图形的切换,比如业务图层的切换,以及底图的切换等等,可以通过控制图层的可见性来实现.比如通过设置图层的opacity .visible来控制,前几天有网友聊天的时候提 ...

  8. poj2480——Longge's problem(欧拉函数)

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9190   Accepted: 3073 ...

  9. jquery实现简单抽奖功能

    一直纠结要怎么用jquery实现抽奖功能,看别人很多都是用flash制作的,找了很多资料,最终找到一个比较适合需求的,我做了些许调整,以下是代码展示(复制下来可以直接使用). 先上图:

  10. .net core i上 K8S(六).netcore程序的service网络代理模式

    上一章我们讲了pod的hostip模式,但在生产环境中,我们都是通过service来访问k8s集群的,service有两种模式来暴漏端口,今天我们来分享一下 1.clusterIP模式 我们在创建se ...