传送门

01trie经典题目。


我们可以通过计算每个数作为次小值时对答案的贡献。

显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[i]a[i]a[i]

于是将原数组排序之后用双向链表维护。

接着用01trie贪心求出贡献。

#include<bits/stdc++.h>
#define N 200005
#define P 30
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,rt[N],pre[N],nt[N],ans=0;
struct node{int id,val;}a[N];
inline bool cmp(node a,node b){return a.val<b.val;}
struct Trie{
	int son[N*30][2],siz[N*30],tot;
	inline int insert(int las,int val){
		int p,ret;
		p=ret=++tot;
		for(int i=P;~i;--i){
			son[p][0]=son[las][0],son[p][1]=son[las][1],siz[p]=siz[las]+1;
			int tmp=(val>>i)&1;
			son[p][tmp]=++tot,las=son[las][tmp],p=son[p][tmp];
		}
		siz[p]=siz[las]+1;
		return ret;
	}
	inline int query(int l,int r,int val){
		int ret=0;
		for(int i=P;~i;--i){
			int tmp=(val>>i)&1;
			if(siz[son[r][tmp^1]]-siz[son[l][tmp^1]])ret|=(1<<i),l=son[l][tmp^1],r=son[r][tmp^1];
			else l=son[l][tmp],r=son[r][tmp];
		}
		return ret;
	}
}T;
int main(){
	n=read();
	for(int i=1;i<=n;++i)a[i]=(node){i,read()},pre[i]=i-1,nt[i]=i+1,rt[i]=T.insert(rt[i-1],a[i].val);
	pre[0]=0,nt[0]=1,pre[n+1]=n,nt[n+1]=n+1,sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;++i){
		int tmp=a[i].id,lasl=pre[tmp],lasr=nt[tmp],l=pre[lasl],r=nt[lasr];
		if(l+1<=lasr-1)ans=max(ans,T.query(rt[l],rt[lasr-1],a[i].val));
		if(r-1>=lasl+1)ans=max(ans,T.query(rt[lasl],rt[r-1],a[i].val));
		nt[pre[tmp]]=nt[tmp],pre[nt[tmp]]=pre[tmp];
	}
	printf("%d",ans);
	return 0;
}

2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)的更多相关文章

  1. BZOJ3166: [Heoi2013]Alo

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 394  Solved: 204[Submit][Status] ...

  2. [BZOJ3166][Heoi2013]Alo 可持久化Trie树

    3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...

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

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

  4. 2018.09.29 Lua

    转自:https://zybuluo.com/lisaisacat/note/636399  谢谢 Lua 基础简明教程 脚本开发   目录 Lua 基础简明教程 目录 注释 Lua 编程 语句块 赋 ...

  5. 2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)

    传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++. ...

  6. 2018.09.29 bzoj3039: 玉蟾宫(悬线法)

    传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...

  7. 2018.09.29 bzoj3156: 防御准备(斜率优化dp)

    传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...

  8. 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)

    传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...

  9. 【可持久化Trie】【set】bzoj3166 [Heoi2013]Alo

    枚举每个数,计算以其为次大数的最大区间,显然,只需要用这个区间的答案 对 答案进行更新即可. 找到每个数右侧.左侧第1.2个比它大的数,然后分类讨论一下即可. 找到的过程中把数sort以后,从大到小把 ...

随机推荐

  1. leetcode127

    class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordLi ...

  2. Spring boot @PropertySource, @ImportResource, @Bean

    @PropertySource:加载指定的配置文件 /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类 ...

  3. Hibernate迫切左外连接和迫切内连接

    •迫切左外连接: •LEFT JOIN FETCH 关键字表示迫切左外连接检索策略. –list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee  ...

  4. javascript 函数对象

    http://hi.baidu.com/gdancer/blog/item/a59e2c12479b4e54f919b814.html jQuery的一些写法就是基于这篇文章的原理的..     函数 ...

  5. java中checked和unchecked 异常处理

    有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译 ...

  6. Oracle to_date()函数的用法《转载》

    to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明, 原文地址:http://database.51cto.com/art ...

  7. 第五章 二叉树(c)二叉树

  8. Python3 bytes 函数

    Python3 bytes 函数  Python3 内置函数 描述 bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列.它是 b ...

  9. DOS 命令集锦——最常用命令

    一. 常用命令: cd 改变当前目录   sys 制作DOS系统盘 (电脑入门到精通网 www.58116.cn) copy 拷贝文件  del 删除文件 deltree 删除目录树    dir 列 ...

  10. PAT L3-008 喊山(广搜)

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的.原来它是彝族先民用 ...