题目描述

21ZZ 年,冬。
小诚退休以后, 不知为何重新燃起了对物理学的兴趣。 他从研究所借了些实验仪器,整天研究各种微观粒子。这
一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始观测。 在精密仪器的视野下,构成陨石
的每个原子都无比清晰。 小诚发现, 这些原子排成若干列, 每一列的结构具有高度相似性。于是,他决定对单
独一列原子进行测量和测试。被选中的这列共有 N 个顺序排列的原子。 最初, 第 i 个原子具有能量 Ei。 随着
时间推移和人为测试, 这列原子在观测上会产生两种变化:
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 的子区间。
小诚坚信这项研究可以获得诺贝尔物理学奖。为了让小诚早日了结心愿,你能否帮助他实现上述的观测和测量呢?

输入

第一行, 两个整数 N, M, 分别表示最初的原子数目和事件总数。
第二行, N 个整数 E1, E2, …, EN, 由空格隔开。依次表示每个原子的能量。
接下来 M 行, 每行为一个字符串和两个整数, 描述一次事件,格式见题目描述。
N<=100,000,M<=100,000
1 ≤ e, Ei ≤ 109。 设 N’ 为当前时刻原子数目。
对于 merge 类事件, 1 ≤ x ≤ N’-1;
对于 insert 类事件, 1 ≤ x ≤ N’;
对于 max 和 min 类事件, 1 ≤ x < y ≤ N’。
任何时刻,保证 N’ ≥ 2。

输出

输出若干行, 按顺序依次表示每次 max 和 min 类事件的测量结果。

样例输入

4 3
5 8 10 2
max 1 3
min 1 3
max 2 4

样例输出

5 2 8
 
题目需要维护一个序列要求能删除、插入、求区间最大最小极差。
用一个平衡树维护即可区间信息及插入删除即可。
对于区间最大极差:因为将区间扩大只会使最小值更小、最大值更大,所以最大极差就是区间最小值与最大值的差。维护区间最大值、最小值即可。
对于区间最小极差:同样因为扩大区间会使极差变大,所以最小极差就是相邻两数的差的最小值。维护每个点与前一个点的差及区间相邻点差的最小值即可。
每一次插入或删除时要改变后继与前一个点的差(因为它前一个点变了)。
注意第一个点与前一个点的差是INF。
代码不是很清真。

#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的更多相关文章

  1. BZOJ4864 BeiJing 2017 Wc神秘物质(splay)

    splay维护区间最大值.最小值.相邻两数差的绝对值的最小值即可. #include<iostream> #include<cstdio> #include<cmath& ...

  2. [bzoj4864][BeiJing 2017 Wc]神秘物质

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...

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

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

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

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

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

    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/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...

  8. #4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]

    这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ ...

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

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

随机推荐

  1. AliOS-Things Visual studio code helloworld 入门

    配置环境的时候别忘了下载:GCC工具链:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads AliOS Thing ...

  2. Android学习之多触点滑动

    知识点: 1.对矩阵:Matrix类熟悉,链接:https://blog.csdn.net/jdsjlzx/article/details/52741445 2.MotionEvent详解:https ...

  3. Unable to execute dex: Multiple dex files defineLcom/google/gson/JsonDeserializer;

    这是异常想必大家都知道的,是关于一个android jar包冲突的问题.为什么还要提呢,是因为这玩意真心让人蛋疼.有些时候稍微不注意(手贱)多导入一个包,就完蛋了.(jar包多的话搞不好带一上午调试) ...

  4. node 命令行升级版本

    node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 1. 首先安装n模块: npm install -g n 2. 升级node.js到最新稳定版 n stable ...

  5. SQL Server 索引中include的魅力(具有包含性列的索引)(转载)

    开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”.  [索引覆盖] 如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不 ...

  6. 转的一个Java基本功

    京京肚肚撸代码 2017-04-11 00:21 很早之前, 记得一次面试, 面试官问存储金钱用什么数据类型? 当时只知道8种数据类型(boolean, byte, short, int, long, ...

  7. ASP.NET Web API上实现 Web Socket - 转

    1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...

  8. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...

  9. Flutter - Json序列化

    这个问题,FlutterChina小组已经说明的非常清楚易懂了. 详见https://flutterchina.club/json/

  10. Nginx挂载维护页或返回自定义响应信息

    在服务停机升级或者服务暂不可用时,往往希望能够返回给用户更为明确和友好的响应信息.可以通过修改nginx配置文件,达到返回自定义信息的效果.有如下几种配置方式: (1)Nginx接收到的所有请求,都返 ...