BZOJ 3166 Alo
处理出每个数最靠近它的左右两个比它大的数。
然后可持久化trie。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200050
#define inf 1000000007
using namespace std;
struct num
{
int val,id;
}p[maxn];
int n,a[maxn];
int seg_ls[maxn<<],seg_rs[maxn<<],val1[maxn<<],val2[maxn<<],seg_root,seg_tot=,l1[maxn],l2[maxn],r1[maxn],r2[maxn];
int tree[maxn*][],sum[maxn*],root[maxn],bitt[],ans=,tot=;
bool cmp(num x,num y)
{
return x.val>y.val;
}
void get_table()
{
bitt[]=;
for (int i=;i<=;i++)
bitt[i]=bitt[i-]*;
}
void build_seg(int &now,int left,int right)
{
now=++seg_tot;val1[now]=;val2[now]=inf;
if (left==right) return;
int mid=(left+right)>>;
build_seg(seg_ls[now],left,mid);
build_seg(seg_rs[now],mid+,right);
}
int ask_seg(int now,int left,int right,int pos,int type)
{
if (left==right)
{
if (type==) return val1[now];
else return val2[now];
}
int mid=(left+right)>>;
if (type==)
{
if (pos<=mid) return max(val1[now],ask_seg(seg_ls[now],left,mid,pos,type));
else return max(val1[now],ask_seg(seg_rs[now],mid+,right,pos,type));
}
else
{
if (pos<=mid) return min(val2[now],ask_seg(seg_ls[now],left,mid,pos,type));
else return min(val2[now],ask_seg(seg_rs[now],mid+,right,pos,type));
}
}
void modify_seg(int now,int left,int right,int l,int r,int x,int type)
{
if ((left==l) && (right==r))
{
if (type==) val1[now]=max(val1[now],x);
else val2[now]=min(val2[now],x);
return;
}
int mid=(left+right)>>;
if (r<=mid) modify_seg(seg_ls[now],left,mid,l,r,x,type);
else if (l>=mid+) modify_seg(seg_rs[now],mid+,right,l,r,x,type);
else
{
modify_seg(seg_ls[now],left,mid,l,mid,x,type);
modify_seg(seg_rs[now],mid+,right,mid+,r,x,type);
}
}
void work(int x)
{
l1[p[x].id]=ask_seg(seg_root,,n,p[x].id,);
if (l1[p[x].id]==) l2[p[x].id]=;
else
{
if (l1[p[x].id]==) l2[p[x].id]=;
else l2[p[x].id]=ask_seg(seg_root,,n,l1[p[x].id]-,);
}
r1[p[x].id]=ask_seg(seg_root,,n,p[x].id,);
if (r1[p[x].id]==inf) {r1[p[x].id]=n+;r2[p[x].id]=n+;}
else
{
if (r1[p[x].id]==n) r2[p[x].id]=n+;
else r2[p[x].id]=ask_seg(seg_root,,n,r1[p[x].id]+,);
if (r2[p[x].id]==inf) r2[p[x].id]=n+;
}
modify_seg(seg_root,,n,p[x].id,n,p[x].id,);
modify_seg(seg_root,,n,,p[x].id,p[x].id,);
}
void insert(int b,int last,int &now,int x)
{
now=++tot;
tree[now][]=tree[last][];tree[now][]=tree[last][];
sum[now]=sum[last]+;
if (b==-) return;
int tmp=x&bitt[b];tmp>>=b;
insert(b-,tree[last][tmp],tree[now][tmp],x);
}
int ask(int b,int last,int now,int x)
{
if (b==-) return ;
int tmp=x&bitt[b];tmp>>=b;
int r=sum[tree[now][tmp^]]-sum[tree[last][tmp^]];
if (r>) return ask(b-,tree[last][tmp^],tree[now][tmp^],x)+bitt[b];
else return ask(b-,tree[last][tmp],tree[now][tmp],x);
}
int main()
{
get_table();
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
p[i].val=a[i];p[i].id=i;
}
sort(p+,p+n+,cmp);
build_seg(seg_root,,n);
for (int i=;i<=n;i++)
work(i);
for (int i=;i<=n;i++)
insert(,root[i-],root[i],a[i]);
for (int i=;i<=n;i++)
{
int l,r;
l=l2[i]+;r=r1[i]-;
ans=max(ans,ask(,root[l-],root[r],a[i]));
l=l1[i]+;r=r2[i]-;
ans=max(ans,ask(,root[l-],root[r],a[i]));
}
printf("%d\n",ans);
return ;
}
BZOJ 3166 Alo的更多相关文章
- 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
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 923 Solved: 437[Submit][Status] ...
- Bzoj 3166 [Heoi2013] Alo 题解
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 518[Submit][Status ...
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- 【BZOJ 3166】【HEOI 2013】Alo
http://www.lydsy.com/JudgeOnline/problem.php?id=3166 这道题难点在于求能对一个次大值有贡献的区间. 设这个次大值为\(a_i\),\(a_i\)左边 ...
- 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 ...
- bzoj 3166 可持久化Tire
每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...
- BZOJ - 3166 可持久化Trie 维护次大区间
题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解 (这题意有点别 ...
随机推荐
- shell 学习基地
http://blog.csdn.net/column/details/shell-daily-study.html?&page=2
- 【HDOJ】【3853】LOOPS
概率DP/数学期望 kuangbin总结中的第7题 其实跟UVA 11762 Race To 1 那道题差不多……直接推下公式,然后倒推即可 Trick:有的点可能是p1[i][j]==1……这样的点 ...
- ubuntu下opencv 3.0和python2.7安装测试
1.安装opencv所需的库(编译器.必须库.可选库) sudo apt-get install build-essential sudo apt-get install cmake git libg ...
- 【QT】OpenCV配置
很郁闷的表示我的opencv放在 D:\\program files 里面路径有个空格,导致我不得不把整个opencv又拷贝到了一个没有空格的路径下面命名为opencvForQt 网上有各种用CMa ...
- CSS 的命名和书写
CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等) 2.大小(width, height, padding, margin) ...
- 2013 Multi-University Training Contest 1 Cards
数据不是很大,直接枚举约数,判断4个条件是否满足! 这样就得到4种卡片,总共2^4种情况,枚举各种情况即可!!! #include<iostream> #include<cmath& ...
- mysql 中 isnull 和 ifnull 判断字段是否为null
对于统计count(type)和avg(type) 都不起作用 SQL中有ISNULL方法,介绍如下: ISNULL使用指定的替换值替换 NULL. 语法ISNULL ( check_expressi ...
- c# 组元(Tuple)
组元是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.组元使用泛型来简化一个类的定义. 先以下面的一段代码为例子: public class Poin ...
- 【mysql的编程专题】触发器
类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql; 一个触发器要具备4要素: 1.监视地点 -- 要执行触发器的表 2.监视事件 -- 由什么DML事件来牵引 3.触发 ...
- vlc/ffmepg/mplayer/gstreamer/openmax/mpc/ffdshow/directshow
一些应该学习的开源框架与库用途和差别 一.播放器层次 这个层次上,是直接可以用的软件,已经做完了一切工作,如果我们需要用他们,是不需要写一行代码的,编译通过就可以拿来使用了,对于国内这些山寨公司来说, ...