题目大意:

让你维护一个序列,支持:

1.合并两个相邻的数为一个新的数

2.在某个位置插入一个数

3.查询一个区间的任意子区间极差的最大值

4.查询一个区间的任意子区间极差的最小值

前两个操作可以用$splay$轻松实现

第三个操作,求区间的子区间极差最大值,额外维护子树内元素最大值最小值即可

第四个操作,求区间的子区间极差最小值

显然,我们选择的子区间越长,极差越大

所以极差最小的子区间一定是相邻的两个数构成的区间

维护一个$lb_{x},rb_{x}$,表示它前/后一个数和它差值的绝对值,每次插入/合并操作时修改这个值即可

再维护一个$ms_{x}$,表示子树内所有节点的$lb_{x},rb_{x}$最小值,注意,它不是x子树代表的区间的极差最小值,是$[L-1,R+1]$的

所以询问长度为2时需要特判

注意最大值inf不要开小了!

建议自己写个暴力和数据生成器对拍,这种题不拍简直找死

 #include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 201000
#define S1 (N1<<1)
#define T1 (N1<<2)
#define ll long long
#define uint unsigned int
#define rint register int
#define ull unsigned long long
#define dd double
#define il inline
#define inf 1000000000
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,T;
int a[N1];
int Abs(int x){return x>?x:-x;}
struct Splay{
#define root ch[0][1]
int ch[N1][],fa[N1],sz[N1],mi[N1],ma[N1],tot;
int ms[N1],val[N1],lb[N1],rb[N1];
void init(){mi[]=ms[]=inf;tot=n+;}
int idf(int x){return ch[fa[x]][]==x?:;}
int cre(int w){tot++,val[tot]=mi[tot]=ma[tot]=w;return tot;}
void con(int x,int ff,int p){fa[x]=ff,ch[ff][p]=x;}
void des(int x){fa[x]=ma[x]=val[x]=ch[x][]=ch[x][]=,mi[x]=ms[x]=lb[x]=rb[x]=inf;}
void pushup(int x)
{
int ls=ch[x][],rs=ch[x][]; ma[x]=mi[x]=val[x]; ms[x]=min(lb[x],rb[x]);
if(ls) ma[x]=max(ma[x],ma[ls]), mi[x]=min(mi[x],mi[ls]), ms[x]=min(ms[x],ms[ls]);
if(rs) ma[x]=max(ma[x],ma[rs]), mi[x]=min(mi[x],mi[rs]), ms[x]=min(ms[x],ms[rs]);
sz[x]=sz[ls]+sz[rs]+;
}
void rot(int x)
{
int y=fa[x],ff=fa[y],px=idf(x),py=idf(y);
fa[ch[x][px^]]=y,ch[y][px]=ch[x][px^];
ch[x][px^]=y,fa[y]=x,ch[ff][py]=x,fa[x]=ff;
pushup(y),pushup(x);
}
void splay(int x,int to)
{
to=fa[to];int y;
while(fa[x]!=to)
{
y=fa[x];
if(fa[y]==to) rot(x);
else if(idf(y)==idf(x)) rot(y),rot(x);
else rot(x),rot(x);
}
}
int find(int K)
{
int x=root;
while()
{
if(K>sz[ch[x][]]){
K-=sz[ch[x][]];
if(K==) return x;
K--; x=ch[x][];
}else{
x=ch[x][];
}
}
}
int split(int l,int r)
{
int x=find(l); splay(x,root);
int y=find(r+);splay(y,ch[x][]);
return ch[y][];
}
void Merge(int K,int w)
{
int x=split(K,K+),f=root,y=ch[f][];
val[x]=w;
if(ch[x][]) des(ch[x][]),ch[x][]=;
if(ch[x][]) des(ch[x][]),ch[x][]=;
rb[f]=lb[x]=Abs(w-val[f]);
rb[x]=lb[y]=Abs(w-val[y]);
pushup(x),pushup(y),pushup(f);
}
void Ins(int K,int w)
{
int x=split(K,K),y=ch[root][],z=cre(w);
con(z,x,);
rb[x]=lb[z]=Abs(w-val[x]);
rb[z]=lb[y]=Abs(w-val[y]);
pushup(z),pushup(x),pushup(y);
}
int Query_max(int L,int R)
{
int x=split(L,R);
return ma[x]-mi[x];
}
int Query_min(int L,int R)
{
int x;
if(R-L<=){
x=split(L,R-);
return rb[x];
}else{
x=split(L+,R-);
return ms[x];
}
}
int Build(int *a,int l,int r,int ff)
{
if(l>r) return ;
int mid=(l+r)>>,x=mid+; fa[x]=ff; val[x]=a[mid];
lb[x]=(mid==)?inf:Abs(a[mid]-a[mid-]);
rb[x]=(mid==n+)?inf:Abs(a[mid]-a[mid+]);
ch[x][]=Build(a,l,mid-,x);
ch[x][]=Build(a,mid+,r,x);
pushup(x); return x;
}
#undef root
}s;
char str[]; int main()
{
//freopen("t2.in","r",stdin);
scanf("%d%d",&n,&m);
int i,x,y,z,cnt=,de; s.init();
for(i=;i<=n;i++) a[i]=gint();
a[]=inf; a[n+]=inf;
s.ch[][]=s.Build(a,,n+,);
for(i=;i<=m;i++)
{
scanf("%s",str);
x=gint(); y=gint();
if(str[]=='e'){
s.Merge(x,y);
}else if(str[]=='n'){
s.Ins(x,y);
}else if(str[]=='a'){
/*cnt++;
if(cnt==957)
de=1;*/
printf("%d\n",s.Query_max(x,y));
}else{
printf("%d\n",s.Query_min(x,y));
}
}
return ;
}

BZOJ 4864 [BJWC2017]神秘物质 (splay)的更多相关文章

  1. 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay

    [BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...

  2. 【BZOJ4864】神秘物质 [Splay]

    神秘物质 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input Sample Output 1 ...

  3. 【BZOJ4864】【BJWC2017】神秘物质 - Splay

    题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...

  4. [BZOJ4864][BeiJing2017Wc]神秘物质(splay)

    首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...

  5. BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)

    Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...

  6. BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告

    4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...

  7. BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay

    BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...

  8. [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap

    神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...

  9. BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )

    这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...

随机推荐

  1. SQL 到 NOSQL 的思维转变

    转自:http://blogread.cn/it/article/3130?f=wb SQL 到 NOSQL 的思维转变 NOSQL系统一般都会宣传一个特性,那就是性能好,然后为什么呢?关系型数据库发 ...

  2. 用CSS来控制字符长度和显示长度

    在网页排版设计中,会遇到文本超过固定长度导致整体的网页变形的情况.程序员往往需要截取固定的长度来实现某些固定长度的控制.介绍一种直接采 用CSS的代码控制来实现文本截取的方法,与程序员的直接字符截取的 ...

  3. 批量修改Linux系统密码

    截取主机IP地址最后一位数.匹配一组定义好的自定义密码.使用chpasswd修改主机账户密码 截图主机IP [root@web01 ~]# ip addr 1: lo: <LOOPBACK,UP ...

  4. 【codeforces 803E】Roma and Poker

    [题目链接]:http://codeforces.com/contest/803/problem/E [题意] 给你一个不完整的胜负平序列(不完整是指中间有些地方为问号,让你自己选择胜负平) 让你复原 ...

  5. 工具-VS插件Resharper快捷键

    编辑Ctrl + Space 代码完成 Ctrl + Shift + Space代码完成Ctrl + Alt + Space代码完成Ctrl + P 显示参数信息Alt + Insert 生成构造函数 ...

  6. ios假设写一个提示带动画的View,能够来引导用户行为

    先上图: 这个UIView能够这样写: -(id)initWithFrame:(CGRect)frame backImage:(UIImage*)image msgStr:(NSString*)txt ...

  7. Hadoop问题记录:Wrong FS: hdfs://hp5-249:9000/, expected: file:///

    一般在对文件操作的时候可能出现这个问题,可能是打开文件的时候出错,也可能是对文件夹进行遍历的时候出问题. 出现这样的问题通常是在eclipse中执行hadoop的时候出现,直接切换到shell下发送命 ...

  8. MySQL List分区(三)

    具体介绍请看   MySQL分区一 样例:该样例为本人个人学习总结分享

  9. Ruby学习(三)——类与对象(1)

    今天看了<Ruby元编程>,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家.其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧 ...

  10. 机器学习案例学习【每周一例】之 Titanic: Machine Learning from Disaster

     下面一文章就总结几点关键: 1.要学会观察,尤其是输入数据的特征提取时,看各输入数据和输出的关系,用绘图看! 2.训练后,看测试数据和训练数据误差,确定是否过拟合还是欠拟合: 3.欠拟合的话,说明模 ...