bzoj 3166 可持久化Tire
每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值
按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的
然后Tire上跑就行了。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<set>
#define N 50050
using namespace std;
int sz,ch[33*N][2],sum[33*N],n,root[N],tim;
set<int > s;
struct data{int val,id;}a[N];
bool cmp(data a,data b){return a.val>b.val;}
void insert(int p,int &rt,int x){
rt=++sz; int now=rt;
sum[rt]=sum[p]+1;
for(int i=30;~i;i--){
int t=(x>>i)&1;
ch[now][0]=ch[p][0];
ch[now][1]=ch[p][1];
ch[now][t]=++sz;
now=ch[now][t]; p=ch[p][t];
sum[now]=sum[p]+1;
}
}
int query(int x,int l,int r){
int ans=0;
for(int i=30;~i;i--){
int t=(x>>i)&1;
if(sum[ch[r][t^1]]-sum[ch[l][t^1]])
l=ch[l][t^1],r=ch[r][t^1],ans+=(1<<i);
else l=ch[l][t],r=ch[r][t];
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].val);
a[i].id=i;
}
for(int i=1;i<=n;i++){
tim=1;
insert(root[i-1],root[i],a[i].val);
}
sort(a+1,a+n+1,cmp);
s.insert(-1); s.insert(-2); s.insert(-3);
s.insert(100000); s.insert(100001); s.insert(100002);
s.insert(a[1].id);
int ans=0;
for(int i=2;i<=n;i++){
set<int>:: iterator h,t;
h=s.lower_bound(a[i].id); t=h;
t++; int r=*t-1;
h--; h--; int l=*h+1;
l=max(1,l); r=min(r,n);
if(l!=r) ans=max(ans,query(a[i].val,root[l-1],root[r]));
s.insert(a[i].id);
}
printf("%d\n",ans);
return 0;
}
bzoj 3166 可持久化Tire的更多相关文章
- BZOJ - 3166 可持久化Trie 维护次大区间
题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解 (这题意有点别 ...
- 51Nod--1295 XOR key (可持久化tire树)
题目链接 1295 XOR key 可持久化tire树模版题 数组一定要开够 不然数组不够的话就容易tle 吃了两次亏 #include<bits/stdc++.h> using name ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1227 Solved: 569[Submit][Status ...
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- BZOJ 3166 set+可持久化trie树(OR 莫队)
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By Siriu ...
- BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)
题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...
- BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie
链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...
随机推荐
- CentOS 7.4上安装mysql 8.0
我的CentOS版本通过从cat /etc/centos-release查看得知 CentOS Linux release 7.4.1708 (Core) 因此需要yum删除mariadb,然后安装m ...
- HTML DOM 实例
DOMAnchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向 ...
- JNDI 使用
J2EE技术规范(一)——JNDI 分类: java 基础2012-12-02 20:05 1539人阅读 评论(14) 收藏 举报 学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步 ...
- access窗体主体居中
Private Sub Form_Load()DoCmd.Echo False Dim x, y As IntegerDoCmd.Maximizex = Me.WindowWidthy = Me.Wi ...
- 8.1 Socket编程
8.1 Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览 ...
- linux下安装xhprof
https://jingyan.baidu.com/article/a24b33cd7ee1d519ff002b6d.html
- Artwork
A template for an artwork is a white grid of n × m squares. The artwork will be created by painting ...
- Sublime text 3 注册码激活码 版本号3143
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- 我写的python代码的规则
1.Python文件的命名: 采用每个单词的首字母大写,不使用下划线 2.Python类的命名: 采用每个单词的首字母大写,不使用下划线 3.Python包名的命名:采用每个单词都是小写,不使用下划线 ...
- linux系统下安装tomcat服务器
一.首先需要关闭linux防火墙(重启后生效) chkconfig iptables off 二.从官网上下载Linux合适版本的tomcat,我现在下来的文件为apache-tomcat-8.5.3 ...