bzoj3166: [Heoi2013]Alo
来源:互联网 发布:淘宝商城墙纸 编辑:程序博客网 时间:2024/05/29 04:46
题目大意:给定一个数列,求一个区间[l,r],区间次大值与区间其他任意数的异或值最大,输出这个最大值;
思路:看到xor最大,就想到可持久化trie。然后我们先要预处理出对于每个数x,区间次大值为x的最大区间是什么。求区间左端点时,我们只要找到前面比x大的第二个数位置a,然后区间左端点就是a-1,右端点同理。于是我们可以用set搞搞,由于暴力也能过,所以就偷了一下懒...预处理完成后,我们只要对于每个数和他对应的区间,询问区间的异或最大值即可。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=60010,maxt=maxn*32;int n,a[maxn],prec[maxn],suc[maxn],ans=0;struct node{int size,c[2];};struct Trie{node t[maxt];int root[maxn],tot;void insert(int id,int val){root[id]=++tot,t[root[id]].size+=t[root[id-1]].size+1;for (int j=31,v,now=root[id],pre=root[id-1];j>=0;j--){v=(val>>j)&1,t[now].c[v]=++tot;t[t[now].c[v]].size=t[t[pre].c[v]].size+1;t[now].c[v^1]=t[pre].c[v^1];now=t[now].c[v],pre=t[pre].c[v];}}int query(int l,int r,int val){int a=root[l-1],b=root[r],ans=0;for (int j=31;j>=0;j--){int v=(val>>j)&1;if (t[t[b].c[v^1]].size-t[t[a].c[v^1]].size) ans|=(1<<j),a=t[a].c[v^1],b=t[b].c[v^1];else a=t[a].c[v],b=t[b].c[v];}return ans;}}T;int main(){scanf("%d",&n);T.insert(1,0);for (int i=1;i<=n;i++) scanf("%d",&a[i]),T.insert(i,a[i]);for (int i=1,cnt,x;i<=n;i++){for (cnt=0,x=i-1;x&&cnt!=2;) if (a[x--]>a[i]) cnt++;prec[i]=x+1;for (cnt=0,x=i+1;x!=n+1&&cnt!=2;) if (a[x++]>a[i]) cnt++;suc[i]=x-1;}for (int i=1;i<=n;i++) ans=max(ans,T.query(prec[i],suc[i],a[i]));printf("%d\n",ans);return 0;}
0 0
- bzoj3166: [Heoi2013]Alo
- [bzoj3166][HEOI2013]ALO
- bzoj3166: [Heoi2013]Alo
- BZOJ3166: [Heoi2013]Alo
- BZOJ3166 [Heoi2013]Alo 可持久化Trie
- 【bzoj3166】【HEOI2013】【Alo】【set+可持久化trie】
- [BZOJ3166][Heoi2013]Alo(可持久化线段树+可持久化tire树)
- bzoj 3166: [Heoi2013]Alo
- 3166: [Heoi2013]Alo
- BZOJ 3166 [Heoi2013]Alo
- 【ChairTrie】【bzoj 3166】: [Heoi2013]Alo
- [GDOI模拟2015.12.19][HEOI2013]ALO
- 3166: [Heoi2013]Alo 可持久化trie
- 可持久化01Trie [Heoi2013]Alo
- bzoj 3166: [Heoi2013]Alo 可持久化trie
- BZOJ 3166 HEOI2013 Alo 可持久化Trie树
- 【BZOJ】【P3166】【Heoi2013】【Alo】【题解】【可持久化Trie+set】
- BZOJ 3166: [Heoi2013]Alo|可持久化Trie树
- 行为型模式-职责链
- Ubuntu14.04LTS安装 Microsoft® ODBC Driver 11 for SQL Server® - RedHat Linux
- 数独问题
- 实时查看股票变化
- C#实现MD5加密
- bzoj3166: [Heoi2013]Alo
- SQLite
- 约瑟夫环:递归算法
- Radar Installation
- python使用get在百度搜索并保存第一页搜索结果
- MPMoviePlayerViewController和MPMoviePlayerController的使用
- 数据结构与算法(javascript描述)——1.编程环境和语法结构
- 分治法排序
- Ubuntu下配置Java环境JDK并配置