BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap
题目描述
输入
输出
样例输入
5 8 10 2
max 1 3
min 1 3
max 2 4
样例输出
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pr pair<int,int>
#define ll long long
using namespace std;
int ls[200010];
int rs[200010];
int r[200010];
int v[200010];
int mn[200010];
int size[200010];
int mx[200010];
int s[200010];
int t[200010];
int n,m;
char ch[10];
int x,y;
int cnt;
int a,b,c,d;
int root;
int build(int val)
{
int rt=++cnt;
v[rt]=val;
r[rt]=rand();
size[rt]=1;
mx[rt]=mn[rt]=val;
ls[rt]=rs[rt]=0;
t[rt]=s[rt]=1e9+7;
return rt;
}
void pushup(int rt)
{
size[rt]=size[ls[rt]]+size[rs[rt]]+1;
mx[rt]=max(max(mx[ls[rt]],mx[rs[rt]]),v[rt]);
mn[rt]=min(min(mn[ls[rt]],mn[rs[rt]]),v[rt]);
t[rt]=min(min(t[ls[rt]],t[rs[rt]]),s[rt]);
}
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(r[x]<r[y])
{
rs[x]=merge(rs[x],y);
pushup(x);
return x;
}
else
{
ls[y]=merge(x,ls[y]);
pushup(y);
return y;
}
}
void split(int rt,int &x,int &y,int k)
{
if(!rt)
{
x=y=0;
return ;
}
if(k<=size[ls[rt]])
{
y=rt;
split(ls[rt],x,ls[y],k);
pushup(rt);
}
else
{
x=rt;
split(rs[rt],rs[x],y,k-size[ls[rt]]-1);
pushup(rt);
}
}
void ins(int k,int val)
{
split(root,a,b,k-1);
split(b,b,c,1);
split(c,c,d,1);
int now=build(val);
t[now]=s[now]=abs(v[now]-v[b]);
if(b==0)
{
t[now]=s[now]=1e9+7;
}
t[c]=s[c]=abs(v[c]-v[now]);
if(c==0)
{
t[c]=s[c]=1e9+7;
}
a=merge(a,b);
a=merge(a,now);
a=merge(a,c);
root=merge(a,d);
}
void del(int k,int val)
{
split(root,a,b,k-1);
split(b,b,c,1);
split(c,c,d,1);
root=merge(a,d);
ins(k-1,val);
}
int query_max(int l,int r)
{
split(root,a,c,r);
split(a,a,b,l-1);
int now=mx[b]-mn[b];
root=merge(merge(a,b),c);
return now;
}
int query_min(int l,int r)
{
l++;
split(root,a,c,r);
split(a,a,b,l-1);
int now=t[b];
root=merge(merge(a,b),c);
return now;
}
int main()
{
srand(12378);
mx[0]=0;
mn[0]=1e9+7;
t[0]=1e9+7;
v[0]=1e9+7;
s[0]=1e9+7;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(i==1)
{
root=build(x);
t[root]=s[root]=1e9+7;
}
else
{
ins(i-1,x);
}
}
while(m--)
{
scanf("%s",ch);
scanf("%d%d",&x,&y);
if(ch[1]=='e')
{
del(x,y);
}
else if(ch[1]=='n')
{
ins(x,y);
}
else if(ch[1]=='a')
{
printf("%d\n",query_max(x,y));
}
else
{
printf("%d\n",query_min(x,y));
}
}
}
BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap的更多相关文章
- BZOJ4864 BeiJing 2017 Wc神秘物质(splay)
splay维护区间最大值.最小值.相邻两数差的绝对值的最小值即可. #include<iostream> #include<cstdio> #include<cmath& ...
- [bzoj4864][BeiJing 2017 Wc]神秘物质
来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )
这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...
- #4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]
这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ ...
- [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap
神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...
随机推荐
- MySQL 基础六 临时表 复制表结构
1.临时表CREATE TEMPORARY TABLE test2( id INT ) SELECT *FROM test2 SHOW TABLES; INSERT INTO test2 VALUES ...
- Daily Sentence(英语每日一句)
1.When you want to give up, remember why you started. 当你想要放弃的时候,请记住当初你为何而开始. 2.It does not do to dwe ...
- linux调度器源码分析 - 新进程加入(三)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经介绍了调度器已经初始化完成,现在只需要加入一个周期定时器tick驱动它进行周期调度即可,而加 ...
- mysql分表操作
一般分表操作有垂直拆分和水平拆分.顾名思义. 1. 垂直拆分是指,这个表的列,即字段,要拆分成两个或多个表. 这个应用场景比如:这个表字段,几个都是int.datetime等,有那么一个是text类 ...
- 微信小程序开发需要注意的30个坑
1.小程序名称可以由中文.数字.英文.长度在3-20个字符之间,一个中文字等于2个字符. 2.小程序名称不得与公众平台已有的订阅号.服务号重复.如提示重名,请更换名称进行设置. 3.小程序名称在帐号信 ...
- WPF中的Bitmap与byte
原文:WPF中的Bitmap与byte public MainWindow() { InitializeComponent(); byte[] b = GetPictureData(@"F: ...
- vue2.0中使用less
第一部分:Less语言 与上一篇<vue2.0中使用sass>介绍的Sass语言一样,Less语言也是一种CSS的扩展语言,增加了变量.混合(minin).函数等功能,让CSS更易维护.方 ...
- 深入理解 JS 引擎执行机制(同步执行、异步执行以及同步中的异步执行)
首先明确两点: 1.JS 执行机制是单线程. 2.JS的Event loop是JS的执行机制,深入了解Event loop,就等于深入了解JS引擎的执行. 单线程执行带来什么问题? 在JS执行中都是单 ...
- mysql 常用的几个函数
IF 函数 语法:`IF`(expr1,expr2,expr3); 当expr1为ture时,值为expr2,当expr1为false时,值为expr3. 如: IFNULL 函数 语法:IFNULL ...
- Spring Cloud 入门教程(九): 路由网关zuul
在微服务架构中,需要几个关键的组件,服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个组件可以组建一个简单的微服务架构.客户端的请求首先经过负载均衡(zuul.Ngnix),再 ...