[BZOJ4864][BeiJing2017Wc]神秘物质(splay)
首先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)的更多相关文章
- [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap
神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...
- 【BZOJ4864】神秘物质 [Splay]
神秘物质 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input Sample Output 1 ...
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- 【BZOJ4864】【BJWC2017】神秘物质 - Splay
题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- BZOJ 4864 [BJWC2017]神秘物质 (splay)
题目大意: 让你维护一个序列,支持: 1.合并两个相邻的数为一个新的数 2.在某个位置插入一个数 3.查询一个区间的任意子区间极差的最大值 4.查询一个区间的任意子区间极差的最小值 前两个操作可以用$ ...
- 【bzoj4864】神秘物质
Description 给出一个长度为n的序列,第i个数为ai,进行以下四种操作: merge x e:将当前第x个数和第x+1个数合并,得到一个新的数e: insert x e:在当前第x个数和第x ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
随机推荐
- Oracle环境变量与中文显示的问题
在CentOS(linux)下安装Oracle,对环境变量的设置有一些讲究. 一般我们可以把环境变量设置在/etc/profile文件中: # Oracle SettingsTMP=/tmp; exp ...
- STL容器基本功能与分类
STL有7中容器. 分别为: vector 向量 <vector>(头文件) 随机访问容器.顺序容器 deque 双端队列 <deque> 随机访问容器.顺序容器 list ...
- mysql 在windons下的备份命令
1. @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" mysqldump -uroot -proot jy510 > ...
- MySQL GTID你知多少【转】
MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...
- linux强制踢掉登录用户【转】
[root@Wang ~]# w :: up :, users, load average: 0.71, 0.58, 0.57 USER TTY FROM LOGIN@ IDLE JCPU PCPU ...
- python 元组分组并排序
# -*- coding: utf-8 -*- # @Time : 2018/8/31 14:32 # @Author : cxa # @File : glomtest.py # @Software: ...
- ADB常用命令(二)
参考 http://adbshell.com/commands 常用命令 查看adb 版本 adb version 打印所有附加模拟器/设备的列表 adb devices 设备序列号 adb get ...
- MySQL 修改数据
UPDATE 语句 修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 可以同时修改 一个 或 多个 字段: 可以在where子句中指定条件: 可以在一个单独表中更新数 ...
- Flask:使用Eclipse+PyDev插件编辑基于package的项目
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2,Eclipse Oxygen.1a Release (4.7.1a),PyDev 6.3.2 本文记录了 使用Ecli ...
- Jmeter 接口测试-请求 Headers 与传参方式
1.添加信息表头. 注意:1.使用Parameters时,Content-Type要么不传,要么传application/x-www-form-urlencoded,因为不传时默认值就是applica ...