首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值。

Splay支持区间最大值,区间最小值,区间相邻差最小值即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,inf=1e9;
char op[];
int n,m,nd,rt,x,y,v[N],d[N],sz[N],mx[N],mn[N],mnd[N],a[N],ch[N][],f[N]; int Abs(int x){ return x< ? -x : x; } void upd(int x){
int ls=ch[x][],rs=ch[x][];
sz[x]=sz[ls]+sz[rs]+;
mn[x]=min(v[x],min(mn[ls],mn[rs]));
mx[x]=max(v[x],max(mx[ls],mx[rs]));
mnd[x]=min(d[x],min(mnd[ls],mnd[rs]));
} void rot(int &rt,int x){
int y=f[x],z=f[y],w=ch[y][]==x;
if (y==rt) rt=x; else ch[z][ch[z][]==y]=x;
f[y]=x; f[x]=z; f[ch[x][w^]]=y;
ch[y][w]=ch[x][w^]; ch[x][w^]=y; upd(y);
} void splay(int &rt,int x){
while (x!=rt){
int y=f[x],z=f[y];
if (y!=rt) (ch[z][]==y ^ ch[y][]==x) ? rot(rt,x) : rot(rt,y);
rot(rt,x);
}
upd(x);
} int build(int l,int r){
if (l>r) return ;
int x=++nd,mid=(l+r)>>;
v[x]=a[mid]; d[x]=Abs(a[mid]-a[mid-]); sz[x]=;
f[ch[x][]=build(l,mid-)]=x; f[ch[x][]=build(mid+,r)]=x;
upd(x); return x;
} int find(int x,int k){
if (sz[ch[x][]]+==k) return x;
if (k<=sz[ch[x][]]) return find(ch[x][],k);
else return find(ch[x][],k-sz[ch[x][]]-);
} void ins(int p,int k){
int x=find(rt,p+),y=find(rt,p+);
splay(rt,x); splay(ch[x][],y);
v[++nd]=k; d[nd]=Abs(v[nd]-v[x]); f[nd]=y; sz[nd]=;
ch[y][]=nd; d[y]=Abs(v[y]-v[nd]); upd(nd); upd(y); upd(x);
} void del(int p){
int x=find(rt,p),y=find(rt,p+);
splay(rt,x); splay(ch[x][],y);
ch[y][]=; d[y]=Abs(v[y]-v[x]); upd(y); upd(x);
} int que(int l,int r,int op){
int x=find(rt,l),y=find(rt,r+);
splay(rt,x); splay(ch[x][],y);
return op== ? mx[ch[y][]] : (op== ? mn[ch[y][]] : mnd[ch[y][]]);
} int main(){
freopen("bzoj4864.in","r",stdin);
freopen("bzoj4864.out","w",stdout);
scanf("%d%d",&n,&m); mnd[]=mn[]=inf;
rep(i,,n) scanf("%d",&a[i]);
rt=build(,n+);
rep(i,,m){
scanf("%s%d%d",op,&x,&y);
if (op[]=='e') del(x),del(x),ins(x-,y);
if (op[]=='n') ins(x,y);
if (op[]=='a') printf("%d\n",que(x,y,)-que(x,y,));
if (op[]=='i') printf("%d\n",que(x+,y,));
}
return ;
}

[BZOJ4864][BeiJing2017Wc]神秘物质(splay)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 4864 [BJWC2017]神秘物质 (splay)

    题目大意: 让你维护一个序列,支持: 1.合并两个相邻的数为一个新的数 2.在某个位置插入一个数 3.查询一个区间的任意子区间极差的最大值 4.查询一个区间的任意子区间极差的最小值 前两个操作可以用$ ...

  7. 【bzoj4864】神秘物质

    Description 给出一个长度为n的序列,第i个数为ai,进行以下四种操作: merge x e:将当前第x个数和第x+1个数合并,得到一个新的数e: insert x e:在当前第x个数和第x ...

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

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

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

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

随机推荐

  1. Linux日志文件/var/log详解

    更多内容推荐微信公众号,欢迎关注: 如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时 ...

  2. 《区块链100问》第75集:大零币Zcash是什么?

    Zcash,全称Zero Cash,简称ZEC,中文叫大零币,研发者为Zooko Wilcox,诞生于2011年11月9日. 采用零知识证明机制提供完全的支付保密性,是目前匿名性最强的数字资产.零知识 ...

  3. CSV 中添加逗号

    由于CSV单元格之间是通过','识别,所以,添加逗号内容,为了防止被当成一个空的单元格,可以将‘,’用双引号括起来,如“,”.

  4. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  5. RobotFramework安装扩展库包Selenium2Library(三)

    Robot Framework扩展库包 http://robotframework.org/#libraries 一,自动化测试web端 1,pip安装SeleniumLibrary pip inst ...

  6. Linux 获取网关地址

    route命令的用法:操作或者显示IP路由表route:DESCRIPTION Route manipulates the kernel's IP routing tables. Its primar ...

  7. 【鬼脸原创】谷歌扩展--知乎V2.0

    目的: 用键盘替代鼠标,做一个安静刷知乎的美男(女)子! 功能:   功能 按键 说明 直接定位到搜索框 q   打开 首页 w   打开 话题 e   打开 发现 r   打开 消息 m   打开 ...

  8. 洛谷P3203弹飞绵羊

    传送门啦 非常神奇的分块大法. 每块分 √N 个元素 , 预处理出来:对于每个点,记录两个量:一个是它要弹几次才能出它所在的这个块,另外一个是它弹出这个块后到哪个点. 查询操作:一块一块跳过去 单次复 ...

  9. Linux 命令find、grep

    本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用选项及实例 find与xar ...

  10. hdu 4559 涂色游戏(SG)

    在一个2*N的格子上,Alice和Bob又开始了新游戏之旅. 这些格子中的一些已经被涂过色,Alice和Bob轮流在这些格子里进行涂色操作,使用两种涂色工具,第一种可以涂色任意一个格子,第二种可以涂色 ...