题目链接: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. Epub 阅读器 - iOS

    因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;其中对解压缩和数据加载方面进行了改造优化,使其更加的完美; 其大概原理是首先将 epub 文件解压后得到 ...

  2. JavaScript高级程序设计(复制变量值、传递参数)

    复制变量值 一个变量向另一个变量复制基本类型值和引用类型值时,是存在不同的. 一个变量向另一个变量复制基本类型的值,会在变量的对象上创建一个新值,然后把该值复制到为新变量分配的位置上. var num ...

  3. Qt5应用程序封包

    系统环境:windows10+vs2017+qt5.12 目的:生成.exe可执行文件. 步骤: 1.选择release模式,生成解决方案. 2.打开命令行,cd到生成的可执行文件.exe目录下 3. ...

  4. 外键参数 onupdate,ondelete等(cascade,no adcion,set null,restrict)

    MySQL外键约束On Delete.On Update各取值的含义 先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性. 当 ...

  5. linux系统中用户

    一.用户身份介绍: 1.系统管理员用户,UID(User IDentification) :0, 2.系统用户,UID为1~999,默认的程序都有独立的系统用户负责,运行,进而控制被破坏的范围, 3. ...

  6. 09JavaScript函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 实例1: <!DOCTYPE html> <html> <head> <meta charset ...

  7. python反射怎么用

    反射: 通过字符串的形式对 对象 进行增删改查 setattr 设置某个属性的值 class A(object): def __init__(self): self.name = "sath ...

  8. 关于instanceof的使用

    测试单独一个类: <?php class A { } $a = new A(); if($a instanceof A){ echo "对象\$a实现了A类"; } 当一个子 ...

  9. Redis,传统数据库,HBase,Hive区别联系

    首先介绍各个数据库: Redis: 传统数据库: HBase: Hive:

  10. python3 练习题100例 (六)

    题目六:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. #!/usr/bin/env python3 ...