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\)最大,输出全局最优解 (这题意有点别 ...
随机推荐
- 3240: [Noi2013]矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
- [转载]App.Config详解及读写操作
App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...
- struts2之请求参数接收
struts2之请求参数接收 1. 采用基本类型接受请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名的属性.请求路径:http:/ ...
- linux源码阅读笔记 jmpi指令(转)
jmpi是段间跳转指令,用于x86实模式下, 如:BOOTSEG = 0x0c70 jmpi 4, #BOOTSEG 假如当前段CS==00h,那么执行此指令后将跳转到段CS==0x0c70,当 ...
- linux sort 命令详解(转 )
linux sort 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比 ...
- POJ1416Shredding Company
http://poj.org/problem?id=1416 题意 : 要为碎纸机公司开发一种新的碎纸机,这种碎纸机要具有3个特性 :一是粉碎机以一个目标数 t 作为输入,并且粉碎的纸上写有一个数字n ...
- Ubuntu环境下手动配置HBase0.94.25
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
- maven 环境搭建 Myeclipse配置
一:Maven的下载安装 准备工作: 1)安装环境 Windows xp 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.e ...
- iOS使用Charts框架绘制—柱形图
首先看一下最终要实现的效果: 最终效果 一.初始化barChartView 绘制柱形图需要用到BarChartView这个类,下面是初始化代码: self.barChartView = [[BarCh ...
- servlet会话技术:Cookie
什么是会话会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.会话过程中需要解决的一些问题每个用户在使用浏览器与服务器进 ...