【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述
Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题。
现在你拥有n颗宝石,每颗宝石有一个能量密度,记为ai,这些宝石的能量密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设为  ai, ai+1, …, a j,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值与其他任意一颗宝石的能量密度按位异或的值,即,设该段宝石能量密度次大值为k,则生成的宝石的能量密度为max{k xor ap | ap ≠ k , i ≤ p ≤ j}。 
现在你需要知道你怎么选取需要融合的宝石,才能使生成的宝石能量密度最大。
输入
第一行,一个整数 n,表示宝石个数。 
第二行, n个整数,分别表示a1至an,表示每颗宝石的能量密度,保证对于i ≠ j有 ai ≠ aj。
输出
输出一行一个整数,表示最大能生成的宝石能量密度。
样例输入
5 
9  2 1 4 7
样例输出
14
题解
可持久化Trie树+STL-set
如果已经知道另外一个数可以出现的区间,那么很容易使用可持久化Trie树求出这个数与它的最大异或值。
所以我们只需要处理出每个数可能是哪些区间的次大值即可。
考虑将所有数从大到小排序,一个一个扔进set中。那么这里面所有的数都比当前的数大,在其中确定范围即可。
很容易想出某个数成为次小值的区间最大范围:最左端为 (前驱的前驱,后继) ,最右端为 (前驱,后继的后继) 。(这里都是开区间)
那么它们的并集就是 (前驱的前驱,后继的后继) ,即其中的所有数都可能出现在以当前数为次大值的区间中。
这样确定了区间以后,剩下的事情就交给可持久化Trie树就好了。按位从大到小无脑贪心即可。
需要注意一下set的边界问题,建议把0和n+1加入到set中防止越界,并减少判断的代码量。
#include <cstdio>
#include <algorithm>
#include <set>
#define N 100010
using namespace std;
struct data
{
int v , id;
}a[N];
set<int> s;
set<int>::iterator it;
int c[N * 30][2] , si[N * 30] , tot , root[N];
bool cmp(data a , data b)
{
return a.v > b.v;
}
int insert(int x , int v)
{
int tmp , y , i;
bool t;
tmp = y = ++tot;
for(i = 1 << 30 ; i ; i >>= 1)
t = v & i , c[y][t ^ 1] = c[x][t ^ 1] , x = c[x][t] , c[y][t] = ++tot , y = c[y][t] , si[y] = si[x] + 1;
return tmp;
}
int query(int x , int y , int v)
{
int ret = 0 , i;
bool t;
for(i = 1 << 30 ; i ; i >>= 1)
{
t = v & i;
if(si[c[y][t ^ 1]] - si[c[x][t ^ 1]]) ret |= i , x = c[x][t ^ 1] , y = c[y][t ^ 1];
else x = c[x][t] , y = c[y][t];
}
return ret;
}
int main()
{
int n , i , ans = 0 , l , r;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i].v) , a[i].id = i , root[i] = insert(root[i - 1] , a[i].v);
sort(a + 1 , a + n + 1 , cmp) , s.insert(0) , s.insert(n + 1);
for(i = 1 ; i <= n ; i ++ )
{
it = s.upper_bound(a[i].id) , it ++ ;
if(it == s.end()) r = n;
else r = *it - 1;
it -- , it -- ;
if(it == s.begin()) l = 1;
else l = *(--it) + 1;
s.insert(a[i].id);
if(i != 1) ans = max(ans , query(root[r] , root[l - 1] , a[i].v));
}
printf("%d\n" , ans);
return 0;
}
【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set的更多相关文章
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
		
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
 - 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
		
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
 - 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(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
 - [BZOJ3261&BZOJ3166]可持久化trie树及其应用
		
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
 - 可持久化Trie树初步
		
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...
 - [十二省联考2019]异或粽子——可持久化trie树+堆
		
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
 - BZOJ4477[Jsoi2015]字符串树——可持久化trie树
		
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
 - BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
		
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
 
随机推荐
- 2017.10.7 QBXT 模拟赛
			
题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...
 - 洛谷 P3387 【模板】缩点
			
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
 - acid (数据库事务正确执行的四个基本要素的缩写)
			
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
 - Hybrid App开发之Html基本标签使用
			
前言: 前面简单学习了html简单标签的使用,今天学习一下其他的标签的使用. HTML的超链接 1.)创建一个超链接 <div> <p> <a href="ht ...
 - 【转】json格式化、高亮库jsonFormater
			
http://leo108.com/pid-1996.asp JsonFormater 基于jQuery的json格式化.高亮库 核心代码参考天马行空工作室,本人只做了模块化和一些代码优化. demo ...
 - javaweb基础(16)_jsp指令
			
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
 - React支持装饰器
			
在用mobx时用到了装饰器,无奈环境不支持装饰器,搜索了半天,网上教程乱七八糟,最后想到了babel官网上肯定有,一搜果然有,安装教程 见Babel官网. 最快捷的教程是官网文档
 - C++实现Singleton模式(effective c++ 04)
			
阅读effective c++ 04 (31页) 提到的singleton设计模式.了解一下. 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. 应用场景: 比 ...
 - python元组的相对不可变性
			
元组与多数python集合(列表.字典.集,等等)一样,保存的是对象的引用.如果引用的元素是可变的,即便元组本身不可变,但是元素依然可变.也就是说元组的不可变性其实是指tuple数据结构的物理内容(即 ...
 - redis学习笔记(1)
			
最近在学习redis,做了比较详细的学习笔记,分享给大家,欢迎一起讨论和学习 第一部分,简单介绍redis 和 redis的基本操作 NoSQL的特点 : 数据库种类繁多,但是一个共同的特点都是去掉关 ...