题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有)

题意概述:

  给出一个序列,对于一个区间,其权值为区间中的次大值亦或区间中任意一个数的结果的最大值。求区间权值的最大值。

分析:

  考虑每个点作为区间次大的状态,发现对于每个点至多有两个最长区间其为次大值(为了让异或结果最大当然是区间越长越好,选择最多),用二分+静态RMQ算出这两个区间再在可持久化trie上面贪心即可。

  论如何现场yy可持久化数据结构23333(基于可持久化线段树的yy算法)

  注意一下算区间的边界问题。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int MAXN=; int N,a[MAXN];
struct data{ int l,r,v; }q[MAXN<<]; int cnt;
int mx[MAXN][];
struct Trie{
static const int maxn=;
static const int maxm=;
int np,root[maxm],to[maxn][],sum[maxn];
Trie(){ np=sum[]=; memset(to[],,sizeof(to[])); }
int copynode(int p){
memcpy(to[++np],to[p],sizeof(to[p]));
sum[np]=sum[p];
return np;
}
void ins(int ver,int x){
root[ver]=copynode(root[ver-]);
int p=root[ver],d;
for(int i=;i>=;i--){
sum[p]++,d=(x>>i)&;
if(!to[p][d]){
to[p][d]=++np,sum[np]=;
memset(to[np],,sizeof(to[np]));
p=to[p][d];
}
else to[p][d]=copynode(to[p][d]),p=to[p][d];
}
sum[p]++;
}
int query(int A,int B,int w){
int p1=root[A],p2=root[B],d;
for(int i=;i>=;i--){
d=((w>>i)&)^;
if(sum[to[p2][d]]-sum[to[p1][d]])
p1=to[p1][d],p2=to[p2][d],w^=d<<i;
else p1=to[p1][d^],p2=to[p2][d^],w^=-d<<i;
}
return w;
}
}trie; void _scanf(int &x)
{
x=;
char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
void data_in()
{
_scanf(N);
for(int i=;i<=N;i++) _scanf(a[i]);
}
void get_st()
{
for(int i=;i<=N;i++) mx[i][]=a[i];
for(int i=N;i>=;i--)
for(int j=;(<<j)<=N-i+;j++)
mx[i][j]=max(mx[i][j-],mx[i+(<<j-)][j-]);
}
int query(int x,int y)
{
int k=;
while((<<k+)<y-x+) k++;
return max(mx[x][k],mx[y-(<<k)+][k]);
}
int getp1(int p,int v)
{
int re=p,mid,L=,R=p;
while(L<R){
mid=L+R>>;
if(query(mid,p-)>v) L=mid+;
else R=mid,re=mid;
}
return re;
}
int getp2(int p,int v)
{
int re=p,mid,L=p+,R=N+;
while(L<R){
mid=L+R>>;
if(query(p+,mid)>v) R=mid;
else L=mid+,re=mid;
}
return re;
}
void work()
{
get_st();
for(int i=;i<=N;i++){
int p1=getp1(i,a[i]),p2=getp2(i,a[i]);
if(p1>) q[++cnt]=(data){getp1(p1-,a[i]),p2,a[i]};
if(p2<N) q[++cnt]=(data){p1,getp2(p2+,a[i]),a[i]};
}
for(int i=;i<=N;i++) trie.ins(i,a[i]);
int ans=;
for(int i=;i<=cnt;i++)
ans=max(ans,trie.query(q[i].l-,q[i].r,q[i].v));
printf("%d\n",ans);
}
int main()
{
data_in();
work();
return ;
}

BZOJ 3166 HEOI2013 ALO 可持久化trie+st表的更多相关文章

  1. bzoj 3166 [Heoi2013]Alo 可持久化Trie

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

  2. BZOJ 3166 [HEOI2013]Alo (可持久化01Trie+链表)

    题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...

  3. BZOJ 3166: [Heoi2013]Alo

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

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

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

  5. Bzoj 3166 [Heoi2013] Alo 题解

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

  6. 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set

    [BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...

  7. 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set

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

  8. BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie

    链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...

  9. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

随机推荐

  1. IPC进程间通信---共享内存

    共享内存 共享内存:共享内存就是分配一块能被其它进程访问的内存.每个共享内存段在内核中维护着一个内部结构shmid_ds, 该结构定义在头文件linux/shm.h中,其结构如下: struct sh ...

  2. CentOS6.5 虚拟机 磁盘扩容

    1. 关闭虚拟机 2. 编辑虚拟机设置:增加硬盘的置备大小,或者添加新的硬盘 3. 启动虚拟机,查看可用磁盘大小 : # df -Th Filesystem Type Size Used Avail ...

  3. 新人成长之入门Vue.js常用指令介绍(一)

    写在前面 作为一个刚步入职场工作的新人,对于公司中所用的技术和框架基本上不懂,只能从最基础的开始做起,进入公司接触的第一个框架就是前端框架Vue.js,几个功能做下来,觉得Vue.js首先学习起来真的 ...

  4. mqtt使用二(集成到java代码中)

    1.我采用的是springboot,首先pom文件中添加mqtt需要用到的依赖 <dependency> <groupId>org.springframework.boot&l ...

  5. Win7配置express4环境

    本机环境: $ node -v v10.14.1 $ npm -v 6.4.1 配置node环境变量: #配置全局安装目录 npm config set prefix "G:\WEB\nod ...

  6. Hadoop原理之——HDFS原理

    Hadoop 3个核心组件: 分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统) 分布式运算编程框架:Mapreduce——实现在 ...

  7. java端连接zookeeper出现unknowHostException错误

    连接zookeeper出现异常:unknowHostException 出现这种错误一开始以为是zookeeper的配置文件出了问题,所以一直在找配置文件的问题,但是zookeeper在虚拟机里面是可 ...

  8. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  9. 用elk+filebeat监控容器日志

    elk  为 elasticsearch(查询搜索引擎),logstash(对日志进行分析和过滤,然后转发给elasticsearch),kibana(一个web图形界面用于可视化elasticsea ...

  10. hive 打印日志

    hive -hiveconf hive.root.logger=INFO,console -e 'select 1' hive 打印log ,有时hive 在配置时默认不会将mapper reduce ...