【BZOJ4864】神秘物质 [Splay]
神秘物质
Time Limit: 10 Sec Memory Limit: 256 MB
Description

Input

Output

Sample Input

Sample Output
1
2
1
5
HINT

Main idea
每个点有一个权值,维护一个结构,支持合并相邻两点,删除单点,加入单点,查询区间子集极差的最大值和最小值。
Solution
首先我们可以发现,区间子集极差的最大值显然就是整个区间的最大值-区间最小值,然后区间子集极差最小值只有相邻点的才会产生贡献。
那么我们用Splay来维护这个结构即可,维护一下子树最大值、子树最小值、子树邻差最小值即可。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ;
const int INF = ; int n,m;
int x,y,a[ONE];
int root,cnt;
int lc[ONE],rc[ONE],fa[ONE];
int size[ONE],val[ONE];
int maxx[ONE],minn[ONE],del[ONE];
int Ls[ONE],Rs[ONE];
char ch[]; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Up(int i)
{
size[i] = size[lc[i]] + size[rc[i]] + ;
maxx[i] = minn[i] = val[i];
del[i] = INF;
Ls[i] = Rs[i] = i;
if(lc[i])
{
Ls[i] = Ls[lc[i]];
maxx[i] = max(maxx[i], maxx[lc[i]]);
minn[i] = min(minn[i], minn[lc[i]]);
del[i] = min(del[i], del[lc[i]]);
del[i] = min(del[i], abs( val[i]-val[Rs[lc[i]]] ) );
}
if(rc[i])
{
Rs[i] = Rs[rc[i]];
maxx[i] = max(maxx[i], maxx[rc[i]]);
minn[i] = min(minn[i], minn[rc[i]]);
del[i] = min(del[i], del[rc[i]]);
del[i] = min(del[i], abs( val[i]-val[Ls[rc[i]]] ) );
}
} void Turn(int x)
{
int y = fa[x], z = fa[y];
int b = x==lc[y] ? rc[x]:lc[x]; fa[y] = x; fa[x] = z;
if(b) fa[b] = y; if(z)
{
if(y == lc[z]) lc[z] = x;
else rc[z] = x;
} if(x==lc[y]) rc[x] = y,lc[y] = b;
else lc[x] = y, rc[y] = b; Up(y); Up(x);
} void Splay(int x,int pos)
{
while(fa[x] != pos)
{
if(fa[fa[x]] != pos)
{
if( (lc[fa[x]]==x) == (lc[fa[fa[x]]]==fa[x]) ) Turn(fa[x]);
else Turn(x);
}
Turn(x);
}
if(pos == ) root = x;
} int Build(int i,int l,int r)
{
int mid = l+r >> ;
fa[mid] = i;
if(l <= mid-) lc[mid] = Build(mid, l,mid-);
if(mid+ <= r) rc[mid] = Build(mid, mid+,r);
Up(mid);
return mid;
} int Getid(int num)
{
int i = root;
while(size[lc[i]] + != num)
{
if(size[lc[i]] + < num)
num -= size[lc[i]] + , i = rc[i];
else i = lc[i];
}
return i;
} void Delete(int i)
{
int x = Getid(i);
Splay(x, );
int L = Rs[lc[x]]; Splay(L,);
int R = Ls[rc[x]]; Splay(R,L);
lc[R] = ;
Splay(R,);
} void Insert(int i,int Val)
{
int x = Getid(i);
Splay(x,);
int R = Ls[rc[x]]; Splay(R,x);
val[++cnt] = Val; fa[cnt] = R; lc[R] = cnt;
Splay(cnt,);
} int main()
{
n=get(); m=get();
for(int i=;i<=n;i++)
val[i+] = get();
val[] = val[n+] = INF; cnt = n+;
root = n+ >> ;
Build(,,n+); while(m--)
{
scanf("%s",ch+); x=get(); y=get();
x++; if(ch[] == 'r')
{
Insert(x+,y);
Delete(x); Delete(x);
}
if(ch[] == 's')
Insert(x,y);
if(ch[] == 'x')
{
y++;
x = Getid(x-); y = Getid(y+);
Splay(x,); Splay(y,x);
printf("%d\n", maxx[lc[y]] - minn[lc[y]]);
}
if(ch[] == 'n')
{
y++;
x = Getid(x-); y = Getid(y+);
Splay(x,); Splay(y,x);
printf("%d\n", del[lc[y]]);
} }
}
【BZOJ4864】神秘物质 [Splay]的更多相关文章
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- [BZOJ4864][BeiJing2017Wc]神秘物质(splay)
首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...
- 【BZOJ4864】【BJWC2017】神秘物质 - Splay
题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- BZOJ 4864 [BJWC2017]神秘物质 (splay)
题目大意: 让你维护一个序列,支持: 1.合并两个相邻的数为一个新的数 2.在某个位置插入一个数 3.查询一个区间的任意子区间极差的最大值 4.查询一个区间的任意子区间极差的最小值 前两个操作可以用$ ...
- [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap
神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...
- 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 BeiJing 2017 Wc神秘物质(splay)
splay维护区间最大值.最小值.相邻两数差的绝对值的最小值即可. #include<iostream> #include<cstdio> #include<cmath& ...
随机推荐
- 哈希表 STL map
计数排序时我们使用一个数组来记录出现的数字的次数,而当数据范围太大时,无法建立一个那么大地数组(而且可能空间利用率很低,太浪费),此时可以改用hash table . binary search tr ...
- (七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)
java中所有的继承都是公有继承. 在子类中的构造其内可以初始化超类的公有域,但不能初始化超类的私有域. 因此需要在子类构造前的第一行使用super()语句初始化超类的私有域. 如果超类没有不带参数的 ...
- alpha阶段个人总结(201521123034陈凯欣)
一.个人总结 第 0 部分:基本数据结构和算法问题 大二的时候上过数据结构课,感觉自己没有学的太深入,就如之前结对编程时候四则运算有用到的二叉树来解决问题,对于二叉树就有个模糊的概念,实际动手操作起来 ...
- (转)Linux常用性能检测命令
一.uptime Uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总体评估(load average).load average值分别记录了上个1分钟,5 ...
- JVM(二)GC
GC简介 Java堆内存 在运行时,java的实例被存放在堆内存区域.当一个对象不在被引用,满足条件就会从堆内存移除并且内存空间被回收.堆内存由三个主要区域 1.新生代 Eden空间(任何实例 ...
- Android基础------SQLite数据库(二)
1.操作SQLite数据库 1.1 execSQL() 可以执行insert.delete.update和CREATE TABLE之类有更改行为的SQL语句 1.2 rawQuery() 可以执行se ...
- js alert()后进行跳转的方法
如果alert()之后再进行跳转本页,按以下方法你将等不到alert(),浏览器就本身刷新本页面了 <script type="text/javascript"> al ...
- 【Python】python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...
- SPFA判負環
馬上就退役了,時間不足就不多介紹了 反正DFS是會T飛的,BFS就沒關係了qwq #include<cmath> #include<queue> #include<cst ...
- Python 源码剖析(三)【字符串对象】
三.字符串对象 1.PyStringObject与PyString_Type 2.创建PyStringObject对象 3.Intern 机制 4.字符缓冲池 5.PyStringObject 效率相 ...