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个区间的值之和最大.区 ...
随机推荐
- springboot-自定义起步依赖
自定义起步依赖步骤: 1. 添加configuration注解文件 - 指定什么情况下加载配置 - 使用enableconfigurationProperties ...
- Thinkphp5 使用composer中seeder播种机
前因: 前几天,客户要求做一个会员问答的系统,我就按流程做了,到了需要调用数据库数据时,觉得一个个添加又有点笨~ 解决过程: 后来查了查手册,看看国外blog案例,我搞出来了个不错的方法~~~ 我的使 ...
- Canvas状态的保存与恢复
Canvas的API提供了save()和restore()的方法,用于保存及恢复当前canvas绘图环境的所有属性. save()与restore()方法可以嵌套调用 save()方法将当前绘图环境压 ...
- OAuth2.0 与 oauth2-server 库的使用
作者:baiyi链接:https://www.jianshu.com/p/83b0f6d82d6c來源:简书 OAuth2.0 是关于授权的开放网络标准,它允许用户已第三方应用获取该用户在某一网站的私 ...
- Java常用容器对比
ArrayList与Vector ArrayList和Vector内部都是由数组实现的,数组实现的优点就是支持元素的随机访问(O(1)),但是在对元素进行插入和删除操作时,需要向后或向前移动数组,这样 ...
- django的response-8
视图函数在处理请求后,必须返回一个 HttpResponse 对象,或者 HttpResponse对象的子对象. 1. HttpResponse 可以通过 django.http.HttpRespon ...
- Leecode刷题之旅-C语言/python-203移除链表元素
/* * @lc app=leetcode.cn id=203 lang=c * * [203] 移除链表元素 * * https://leetcode-cn.com/problems/remove- ...
- JavaWeb——升级赛-学生成绩管理系统(2).java---19.01.03
dao.java package Dao; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLExcept ...
- Alexander的Python机器学习 之目录分析。
无聊,顺应一下潮流,学习一下python机器学习吧. 买了一本书,首先分析一下目录吧. 1.第一章是 Python机器学习的生态系统. 1.1.数据科学或机器学习的工作流程. 然后又分成6点进行详细说 ...
- 【LG4735】最大异或和
[LG4735]最大异或和 题意 洛谷 题解 维护一个前缀异或和\(S_i\) 对于一个询问操作\(l\).\(r\).\(x\) 就是等价于求一个位置\(p\)(\(l\leq p \leq r)\ ...