【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 ...
随机推荐
- connect() to 192.168.30.71:8082 failed (99: Cannot assign requested address) while connecting to upstream, client: 114.80.182.136, server: localhost, request: "GET /home/senior HTTP/1.1", upstream: "
connect() to 192.168.30.71:8082 failed (99: Cannot assign requested address) while connecting to ups ...
- 如何处理错误消息Please install the gcc make perl packages
如何处理这行错误消息? Please install the gcc make perl packages from your distribution. 执行命令行:yum install gcc ...
- prometheus-简介及安装
监控是整个产品周期中最重要的一环,及时预警减少故障影响免扩大,而且能根据历史数据追溯问题. 对系统不间断实时监控 实时反馈系统当前状态 保证业务持续性运行 监控系统 监控方案 告警 特点 适用 Zab ...
- javaweb基础(7)_HttpServletResponse原理详解
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- cocos2dx for lua A*寻路算法实现2
关于A*算法的实现过程,简单来说就是一个计算权限的过程. 首先,创建一个地图节点类,"MapNode.lua" local MapNode = class("MapNod ...
- Mybatis 循环 foreach, 批量操作
mapper.java: int modifySortOfGoods(@Param("idlist") List<String> goodsIds, @Param(&q ...
- vue渲染函数&JSX
Vue推荐在绝大多数情况下使用template来创建你的HTML.然而在一些场景中,你真的需要JavaScript的完全编程能力,这时你可以使用render函数,它比template跟接近编译器. 虚 ...
- 【整理】虚拟机和主机ping不通解决办法,虚拟机ping不通外网的解决方法
检查几个方面: 1.检查虚拟网卡有没有被禁用2.检查虚拟机与物理机是否在一个VMNet中3.检查虚拟机的IP地址与物理机对应的VMNet是否在一个网段4.检查虚拟机与物理机的防火墙是否允许PING, ...
- url,href,src区别
URL(Uniform Resource Locator) 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...
- python有三元运算符吗
所属网站分类: python基础 > 语法,变量,运算符 作者:goodbody 链接: http://www.pythonheidong.com/blog/article/12/ 来源:pyt ...