题目大意:

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

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. [luogu1463 HAOI2007] 反素数 (约数)

    传送门 Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例 ...

  2. strtotime的一个使用问题

    我在开发过程中遇到这么这个问题,因为赶进度,没有记下来处理方案,在鸟哥的博客看到原理分析,很到位!平时开发中总是急着处理问题,没有深入分析和记录问题. 1.问题: 今天是2018-07-31 执行代码 ...

  3. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 1000ms Memory Limit: 65536KB T ...

  4. js/jquery 判断支持touchstart

      if ('ontouchstart' in document.documentElement) { //... }

  5. EntboostChat 0.9(越狱版)公布,iOS免费企业IM

    恩布互联公布IOS免费企业IM 0.9越狱预览版本号,支持全部iPhone4/5手机(6未上真机測试),iPad平板,主要功能包含单聊.群聊,企业组织结构,文本.表情.图片.文件.截图.离线消息等: ...

  6. 有关文档碎片(document fragment)的使用方法

    通常情况下改动.删除或者添加DOM元素. 更新DOM会导致浏览器又一次绘制屏幕,也会导 致reflow,这样会带来巨大的开销.我们通常解决这的办法尽量降低更新DOM.这也就意 味着将DOM的改变分批处 ...

  7. Cocos2dx之使用UI库结合cocostudio

    使用cocostudio的UI编辑器编辑好UI界面,导出UI文件,直接在cocos2dx中使用.通过tag或者name来获取到UI控件 1.编辑ui界面,直接用模板然后拖几个控件过去 2.cocos2 ...

  8. Linux--对文件夹下的配置文件批量改动IP

    sed -i 's/10.1.1.1/10.1.1.2/g' `grep -ir 10.1.1.1 * |grep -E '.xml:|.cfg:|.ini:|.wsdl:|.properties:' ...

  9. Bootstrap警告

    警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 警告(Alerts) 步骤: 1.创建一个 <div> 2.并向其加入一个 .alert ...

  10. caffe训练CIFAR数据库

    CIFAR-10是一个用于普适物体识别的数据集.Cifar-10由60000张32*32的RGB彩色图片构成,50000张训练图片,10000张测试图片,分为10类.cifar下载地址: http:/ ...