神秘物质

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

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

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

  2. [BZOJ4864][BeiJing2017Wc]神秘物质(splay)

    首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...

  3. 【BZOJ4864】【BJWC2017】神秘物质 - Splay

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

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

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

  5. BZOJ 4864 [BJWC2017]神秘物质 (splay)

    题目大意: 让你维护一个序列,支持: 1.合并两个相邻的数为一个新的数 2.在某个位置插入一个数 3.查询一个区间的任意子区间极差的最大值 4.查询一个区间的任意子区间极差的最小值 前两个操作可以用$ ...

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

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

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

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

  8. BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告

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

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

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

随机推荐

  1. SFTPHelper

    public class SFTPHelper { #region 字段或属性 private readonly SftpClient _sftp; /// <summary> /// S ...

  2. [计算机网络] 互联网协议栈(TCP/IP参考模型)各层的主要功能及相应协议

    应用层:提供用户与网络间的接口.----HTTP.FTP.SMTP 运输层:进程到进程间的数据传输.---TCP.UDP 网络层:主机到主机之间的数据传输.---IP.选路协议 数据链路层:相邻结点之 ...

  3. 【Python】python基础_代码编写注意事项

    1. 说明使用的编译方式 1 #!/usr/bin/python 2. 说明字符编码方式 1 #coding=utf-8 3. print 默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 # ...

  4. poj 1719 Shooting Contest (二分匹配)

    Shooting Contest Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3812   Accepted: 1389 ...

  5. Greenlet-手动切换

    yield()是自己写的协程,Greenlet( )是已经封装好了的协程. 协程:遇到 I/O 操作就切换到别的地方了(先去处理其他携程去了).等原协程的 I/O 操作一完成就切回去.这样就把 I/O ...

  6. [BZOJ5303] [HAOI2018] 反色游戏

    题目链接 LOJ:https://loj.ac/problem/2524 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5303 洛谷:https ...

  7. BZOJ4299 & CC FRBSUM:ForbiddenSum & BZOJ4408 & 洛谷4587 & LOJ2174:[FJOI2016]神秘数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4299 https://www.lydsy.com/JudgeOnline/problem.php? ...

  8. 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告

    [USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...

  9. HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)

    HDOJ(HDU).1114 Piggy-Bank (DP 完全背包) 题意分析 裸的完全背包 代码总览 #include <iostream> #include <cstdio&g ...

  10. bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)

    为了1A我居然写了个暴力对拍... 那个式子本质上是求nk个数里选j个数,且j%k==r的方案数. 所以把组合数的递推式写出来f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k].. ...