BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接: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表的更多相关文章
- 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 (可持久化01Trie+链表)
题目大意:给你一个长度为$n$的序列,让你找出一段子序列,求其中的 次大值 异或 序列里一个数 能得到的最大值 先对序列建出可持久化$Trie$ 按元素的值从小到大遍历,设当前元素的位置是i,找出它左 ...
- BZOJ 3166: [Heoi2013]Alo
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 923 Solved: 437[Submit][Status] ...
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- Bzoj 3166 [Heoi2013] Alo 题解
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 518[Submit][Status ...
- 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
- BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie
链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define se ...
- [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)
[BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...
随机推荐
- c#聊聊文件数据库kv
现在有很多KV嵌入式存储,或者已经增加的.leveldb,RaptorDB等,都是相对比较好的存储.基本存储,一般配置.大概在6w/s左右.当然还有缓存等设置问题.这些基本是字符串和int的存储,对于 ...
- es6 数组扩展方法
1.扩展运算符 含义: 扩展运算符,三个点(...),将一个数组转为用逗号分隔的参数顺序. 例如: console.log([1,2,3]); console.log(...[1,2,3]); 结 ...
- mysql小特性:change buffer
change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...
- 【saltstack 集中化管理】
Master(监控端): Minion(被监控端) 监控: /etc/master: #interface:监控端地址 #自动接受被监控端证书 #saltstack文件根目录位置 #启动监控 被监控: ...
- EFI分区删除的有效方法
用Diskpart命令,可以方便的删除EFI系统分区. 一,win + R, 输入cmd,回车. 二,输入 Diskpart ,回车,得到 三,再输入 list disk , 回车,查看磁盘信息 四, ...
- Python 爬虫 (一)
爬: 爬一个网站需要几步? 确定用户的需求 根据需求,寻找网址 读取网页 urllib request requests 定位并提取数据 正则 xpath beautiful soup 存储数据 my ...
- Jetson tx2 串口通信
主要参考了这篇博客:https://blog.csdn.net/zomb1e0117/article/details/85157014 其中需要注意的是最后的时候cutecom端口需要把设备改为:/d ...
- VMware中Linux的NAT相关配置
我这边使用的是CentOS7,因为搭建环境主要是为了后期做集群,所以会搭建三台机器master,slave1,slave2. 一.设置固定IP 1. 进入到/etc/sysconfig/network ...
- [原创]利用python构造ICMP Echo Request并发送
import socket import struct def checksum(source_string): sum = 0 countTo = (len(source_string)/2)*2 ...
- 20145209刘一阳 《网络对抗》逆向及BOF基础实践
直接修改程序机器指令,改变程序执行流程 在正式开始实践之前,先对pwn1文件做个备份,以便修改后可以及时恢复到初始状态: 使用指令objdump -d 20145209 | more对目标文件进行反汇 ...