[HEOI2013]ALO(可持久化Trie+链表)
你永远不会相信一个快AFO的选手不会可持久化Trie。
其实异或粽子那题可以用可持久化Trie做,不过我还是没用,用的一般的Trie(其实可持久化是多此一举),于是到现在还是不会可持久化Trie。
这题首先可以发现要求的是最大值,所以很多区间是没必要的,l1[i]/r1[i]表示左/右边第1个比a[i]大的数,l2[i]/r2[i]表示左/右边第2个比a[i]大的数,然后询问的区间显然是[l2[i]+1,r1[i]-1]和[l1[i]+1,r2[i]-1]二者的最大值,然后由于询问的是连续段的异或最大值,可以发现就是可持久化Trie的板子了,至于l[i],r[i],用链表式维护即可,不需要set/treap等大常数做法。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
const int N=;
int n,cnt,ans,a[N],rt[N],ch[N*][],sz[N*],L[N],R[N];
pii b[N];
void build(int x,int id)
{
int u,v=rt[id-];u=rt[id]=++cnt;
sz[u]=sz[v]+;
for(int i=;~i;i--)
{
int c=x>>i&;
ch[u][c^]=ch[v][c^],ch[u][c]=++cnt;
u=ch[u][c],v=ch[v][c],sz[u]=sz[v]+;
}
}
int query(int x,int l,int r)
{
if(l>r)return ;
l=rt[l-],r=rt[r];
int ret=;
for(int i=;~i;i--)
{
int c=x>>i&;
if(sz[ch[r][c^]]-sz[ch[l][c^]])ret+=<<i,l=ch[l][c^],r=ch[r][c^];
else l=ch[l][c],r=ch[r][c];
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),build(a[i],i),b[i]=pii(a[i],i),L[i]=i-,R[i]=i+;
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
int x=b[i].second,l=L[x],r=R[x];L[r]=l,R[l]=r;
if(l)ans=max(ans,query(a[x],L[l]+,r-));
if(r)ans=max(ans,query(a[x],l+,R[r]-));
}
printf("%d",ans);
}
[HEOI2013]ALO(可持久化Trie+链表)的更多相关文章
- bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1227 Solved: 569[Submit][Status ...
- 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
- BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)
题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- P4098 [HEOI2013]ALO 可持久化01Trie
$ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
随机推荐
- Java基础之内省
Java基础之内省 什么是内省 首先,我们要知道什么是内省.按我自己的理解就是在反射的原理上进行封装,来更方便的操作JavaBean JavaBean就是特殊格式的类,其规范为: JavaBean ...
- Z-function
用更容易理解的方法处理出 s[l----r]=s[1----r-l+1] 常数比KMP略大,时间复杂度\(O(n)\),方法和manacher很像 #include<bits/stdc++.h& ...
- 国内OLED产业与三星到底是差之千里还是近在咫尺?
此前,市面上几乎大部分智能手机搭载的刘海屏,都是来自三星的AMOLED屏幕.虽然三星总是被诟病为中国手机厂商提供的是"次品",不过没办法,OLED屏幕的核心技术.产能等都掌握在三星 ...
- python3.7使用etree遇到的问题
使用python3.6时安装好lxml时按照许多网上的教程来引入会发现etree没被引入进来 解决办法: 一.import lxml.htmletree = lxml.html.etree这样就可以使 ...
- 安卓app测试之Monkey日志分析《转载》
安卓app测试之Monkey日志分析 链接:https://www.cnblogs.com/wuzm/p/10965762.html
- java多线程并发(二)--线程的生命周期及方法详解
上篇随笔介绍了线程的相关基础知识以及新启线程的几种方法,本片将继续介绍线程的生命周期及方法详解. 一.线程的生命周期 在Thread代码中,线程的状态被分为6种 public enum State { ...
- java内存机制 垃圾回收
gc机制一 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc ...
- python *args 和 ** kwargs
可变长度的参数 *args的使用方法 *args 用来将参数打包成tuple给函数体调用 可见,1这个参数,被打包成了一个元组 def func(*args): print(args,type(arg ...
- python 进程和线程(2)
这篇博客是按照博客<进程和线程(1)>中内容用futures改写 with futures.ProcessPoolExecutor() as executor:可以两篇博客对照看. 2改 ...
- 82.常用的返回QuerySet对象的方法使用详解:all,select_related
1. all: 返回这个ORM模型的QuerySet对象. articles = Article.objects.all() print(articles) 2.select_related: 查找数 ...