【bzoj4864】神秘物质
Description
给出一个长度为n的序列,第i个数为ai,进行以下四种操作:
merge x e:将当前第x个数和第x+1个数合并,得到一个新的数e;
insert x e:在当前第x个数和第x+1个数之间插入一个新的数e;
max x y:求当前第x个数到第y个数之间任意子区间中区间极差的最大值;
min x y:求当前第x个数到第y个数之间任意子区间中区间极差的最小值
(区间极差:区间内最大值与最小值之差)
(子区间长度至少为2)
Solution
splay模板题。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[];
namespace splay{
#define lson(x) t[x].lc
#define rson(x) t[x].rc
#define fa(x) t[x].fa
struct tree{
int lc,rc,fa;
int size,val,maxn,minn;
int delta,ans;
}t[]={};
int root=,cnt=;
void pushup(int x){
t[x].size=t[lson(x)].size+t[rson(x)].size+;
t[x].maxn=max(t[x].val,max(t[lson(x)].maxn,t[rson(x)].maxn));
t[x].minn=t[x].val;
if(lson(x))
t[x].minn=min(t[x].minn,t[lson(x)].minn);
if(rson(x))
t[x].minn=min(t[x].minn,t[rson(x)].minn);
t[x].ans=t[x].delta;
if(lson(x))
t[x].ans=min(t[x].ans,t[lson(x)].ans);
if(rson(x))
t[x].ans=min(t[x].ans,t[rson(x)].ans);
return;
}
int build(int l,int r){
int mid=(l+r)>>,s=++cnt;
t[s].val=a[mid];
t[s].delta=(mid)?abs(a[mid]-a[mid-]):0x3f3f3f3f;
if(l<mid){
lson(s)=build(l,mid-);
fa(lson(s))=s;
}
if(mid<r){
rson(s)=build(mid+,r);
fa(rson(s))=s;
}
pushup(s);
return s;
}
int find(int k){
int p=root;
while(true){
if(t[lson(p)].size>=k)
p=lson(p);
else if(t[lson(p)].size+==k)
return p;
else{
k-=t[lson(p)].size+;
p=rson(p);
}
}
}
void rotate(int x){
int fa=fa(x);
if(fa==root)
root=x;
if(x==lson(fa)){
lson(fa)=rson(x);
fa(rson(x))=fa;
rson(x)=fa;
fa(x)=fa(fa);
if(root!=x){
if(fa==lson(fa(fa)))
lson(fa(fa))=x;
else
rson(fa(fa))=x;
}
fa(fa)=x;
}
else{
rson(fa)=lson(x);
fa(lson(x))=fa;
lson(x)=fa;
fa(x)=fa(fa);
if(root!=x){
if(fa==lson(fa(fa)))
lson(fa(fa))=x;
else
rson(fa(fa))=x;
}
fa(fa)=x;
}
pushup(fa);
pushup(x);
return;
}
void splay(int x,int y){
while(fa(x)!=y){
if(fa(fa(x))==y){
rotate(x);
return;
}
int a=(x==lson(fa(x)))?:-;
int b=(fa(x)==lson(fa(fa(x))))?:-;
if(a*b==){
rotate(fa(x));
rotate(x);
}
else{
rotate(x);
rotate(x);
}
}
return;
}
void insert(int x,int y){
splay(find(x),);
splay(find(x+),root);
lson(rson(root))=++cnt;
fa(cnt)=rson(root);
t[cnt].size=;
t[cnt].val=t[cnt].maxn=t[cnt].minn=y;
t[cnt].delta=t[cnt].ans=abs(t[root].val-y);
t[rson(root)].delta=abs(t[rson(root)].val-y);
pushup(rson(root));
pushup(root);
return;
}
void del(int x){
splay(find(x-),);
splay(find(x+),root);
lson(rson(root))=;
t[rson(root)].delta=abs(t[root].val-t[rson(root)].val);
pushup(rson(root));
pushup(root);
}
int querymaxn(int l,int r){
splay(find(l-),);
splay(find(r+),root);
return t[lson(rson(root))].maxn-t[lson(rson(root))].minn;
}
int queryminn(int l,int r){
splay(find(l-),);
splay(find(r+),root);
return t[lson(rson(root))].ans;
}
#undef lson
#undef rson
#undef fa
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",a+i);
a[]=0x3f3f3f3f;
a[n+]=-0x3f3f3f3f;
splay::root=splay::build(,n+);
scanf("%d",&m);
while(m--){
char op[];int x,y;
scanf("%s%d%d",op,&x,&y);
if(op[]=='i')
splay::insert(x+,y);
else if(op[]=='e'){
splay::del(x+);
splay::del(x+);
splay::insert(x,y);
}
else if(op[]=='a')
printf("%d\n",splay::querymaxn(x+,y+));
else
printf("%d\n",splay::queryminn(x+,y+));
}
return ;
}
【bzoj4864】神秘物质的更多相关文章
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- [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 ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- [BZOJ4864][BeiJing2017Wc]神秘物质(splay)
首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...
- BZOJ4864 BeiJing 2017 Wc神秘物质(splay)
splay维护区间最大值.最小值.相邻两数差的绝对值的最小值即可. #include<iostream> #include<cstdio> #include<cmath& ...
- [bzoj4864][BeiJing 2017 Wc]神秘物质
来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...
- BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap
题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始 ...
- 【BZOJ4864】【BJWC2017】神秘物质 - Splay
题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...
随机推荐
- HDU 1166 敌兵布阵(线段树单节点更新 区间求和)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Dere ...
- webstorm 添加 autoprefixer 工具为CSS加前缀
webstrom IDE 的 setting (快捷键 Ctrl + Alt + S) Tool -- External tool (绿色 + 添加) 3.填写 必要的项目 后 apply 备注:N ...
- 紫书 习题 10-6 UVa 1210(前缀和)
素数筛然后前缀和 看代码 #include<cstdio> #include<vector> #include<cstring> #include<map&g ...
- FOJ1205 小鼠迷宫问题 (BFD+递推)
FOJ1205 小鼠迷宫问题 (BFD+递推) 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均 ...
- rsyslog学习
http://blog.csdn.net/zhaoyangjian724/article/details/52116809 http://blog.csdn.net/zhangxihangzhuan/ ...
- eclipse下Tomcat7.0启动奔溃问题
好久没用Eclipse了,如今上班这家公司正好用到了,完后用Tomcat启动项目一直报一个错,例如以下图 错误代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- Xamarin大佬的地址
https://www.cnblogs.com/hlx-blogs/p/7266098.html http://www.cnblogs.com/GuZhenYin/p/6971069.html
- LDAP实现企业异构平台的统一认证
LDAP实现企业异构平台的统一认证 技术是为应用服务的,没有应用,技术就无用武之地.同样光配置完LDAP服务器没有任何意义,只有把所有需要认证的环节,只有纳入LDAP系统中,才能使它发挥应有 ...
- sql 向上取整 向下取整 四舍五入的实例;
SELECT CEILING(23.5/4)'向上取整' ---6 :SELECT FLOOR(23.5/4)'向下取整' ---5 :SELECT ROUND(23.5/4,1)'四舍五入' --5 ...
- noip 2018 day1 T1 铺设道路 贪心
Code: #include<cstdio> using namespace std; int main() { int last=0,ans=0; int n;scanf("% ...