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个区间的值之和最大.区 ...
随机推荐
- HDU 2065 "红色病毒"问题(生成函数)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- ssh登录等待时间超时问题的解决
最近使用ssh登录服务器时,发现许多服务器会报告等待时间超时的错误,通过网上查找发现是由于ssh中的配置中开启了DNS反查的功能,导致在反查过程中消耗了很长的时间,现将解决方法总结如下: 使用root ...
- 07.安装及使用gitlub
博客为日常工作学习积累总结: 1.安装gitlub sudo yum install -y curl policycoreutils-python openssh-server openssh-cli ...
- tp js结合时间戳
$(document).ready(function(){ $.extend({ show:function(){ } }); setInterval("show()",1000) ...
- 大数据学习--day10(继承-权限-super-final-多态-组合)
继承-权限-super-final-多态-组合 权限修饰符 内容 public protected default(不写就是它) ...
- Hadoop 动态扩容 增加节点
基础准备 在基础准备部分,主要是设置hadoop运行的系统环境 修改系统hostname(通过hostname和/etc/sysconfig/network进行修改) 修改hosts文件,将集群所有节 ...
- 『Python基础-4』字符串
# 『Python基础-4』字符串 目录 1.什么是字符串 2.修改字符串 2.1 修改字符串大小 2.2 合并(拼接)字符串 2.3 使用乘号'*'来实现字符串的叠加效果. 2.4 在字符串中添加空 ...
- URL和报文知识总结 ——1
第一部分:浏览器生成的消息 关键词:URL的解析 HTTP请求的生成 DNS服务器 1.URL(网址)的构成: 对于一个网址的解析: https://i.cnblogs.com/index.htm ...
- 关于指针的笔记【1】【C语言程序设计-谭浩强】
指针是什么? 一个 变量的地址称为该变量的"指针"[将地址形象化的称为“指针”].(指针是什么百度百科) 注意区分储存单元的地址和内容这两个概念的区别. 直接访问:直接按变量名进行 ...
- N个点中寻找多个最近两点的计算O(N²)
#include<math.h> #include<stdio.h> #include<stdlib.h> typedef struct point { float ...