BZOJ 4864 [BJWC2017]神秘物质 (splay)
题目大意:
让你维护一个序列,支持:
1.合并两个相邻的数为一个新的数
2.在某个位置插入一个数
3.查询一个区间的任意子区间极差的最大值
4.查询一个区间的任意子区间极差的最小值
前两个操作可以用$splay$轻松实现
第三个操作,求区间的子区间极差最大值,额外维护子树内元素最大值最小值即可
第四个操作,求区间的子区间极差最小值
显然,我们选择的子区间越长,极差越大
所以极差最小的子区间一定是相邻的两个数构成的区间
维护一个$lb_{x},rb_{x}$,表示它前/后一个数和它差值的绝对值,每次插入/合并操作时修改这个值即可
再维护一个$ms_{x}$,表示子树内所有节点的$lb_{x},rb_{x}$最小值,注意,它不是x子树代表的区间的极差最小值,是$[L-1,R+1]$的
所以询问长度为2时需要特判
注意最大值inf不要开小了!
建议自己写个暴力和数据生成器对拍,这种题不拍简直找死
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 201000
#define S1 (N1<<1)
#define T1 (N1<<2)
#define ll long long
#define uint unsigned int
#define rint register int
#define ull unsigned long long
#define dd double
#define il inline
#define inf 1000000000
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,T;
int a[N1];
int Abs(int x){return x>?x:-x;}
struct Splay{
#define root ch[0][1]
int ch[N1][],fa[N1],sz[N1],mi[N1],ma[N1],tot;
int ms[N1],val[N1],lb[N1],rb[N1];
void init(){mi[]=ms[]=inf;tot=n+;}
int idf(int x){return ch[fa[x]][]==x?:;}
int cre(int w){tot++,val[tot]=mi[tot]=ma[tot]=w;return tot;}
void con(int x,int ff,int p){fa[x]=ff,ch[ff][p]=x;}
void des(int x){fa[x]=ma[x]=val[x]=ch[x][]=ch[x][]=,mi[x]=ms[x]=lb[x]=rb[x]=inf;}
void pushup(int x)
{
int ls=ch[x][],rs=ch[x][]; ma[x]=mi[x]=val[x]; ms[x]=min(lb[x],rb[x]);
if(ls) ma[x]=max(ma[x],ma[ls]), mi[x]=min(mi[x],mi[ls]), ms[x]=min(ms[x],ms[ls]);
if(rs) ma[x]=max(ma[x],ma[rs]), mi[x]=min(mi[x],mi[rs]), ms[x]=min(ms[x],ms[rs]);
sz[x]=sz[ls]+sz[rs]+;
}
void rot(int x)
{
int y=fa[x],ff=fa[y],px=idf(x),py=idf(y);
fa[ch[x][px^]]=y,ch[y][px]=ch[x][px^];
ch[x][px^]=y,fa[y]=x,ch[ff][py]=x,fa[x]=ff;
pushup(y),pushup(x);
}
void splay(int x,int to)
{
to=fa[to];int y;
while(fa[x]!=to)
{
y=fa[x];
if(fa[y]==to) rot(x);
else if(idf(y)==idf(x)) rot(y),rot(x);
else rot(x),rot(x);
}
}
int find(int K)
{
int x=root;
while()
{
if(K>sz[ch[x][]]){
K-=sz[ch[x][]];
if(K==) return x;
K--; x=ch[x][];
}else{
x=ch[x][];
}
}
}
int split(int l,int r)
{
int x=find(l); splay(x,root);
int y=find(r+);splay(y,ch[x][]);
return ch[y][];
}
void Merge(int K,int w)
{
int x=split(K,K+),f=root,y=ch[f][];
val[x]=w;
if(ch[x][]) des(ch[x][]),ch[x][]=;
if(ch[x][]) des(ch[x][]),ch[x][]=;
rb[f]=lb[x]=Abs(w-val[f]);
rb[x]=lb[y]=Abs(w-val[y]);
pushup(x),pushup(y),pushup(f);
}
void Ins(int K,int w)
{
int x=split(K,K),y=ch[root][],z=cre(w);
con(z,x,);
rb[x]=lb[z]=Abs(w-val[x]);
rb[z]=lb[y]=Abs(w-val[y]);
pushup(z),pushup(x),pushup(y);
}
int Query_max(int L,int R)
{
int x=split(L,R);
return ma[x]-mi[x];
}
int Query_min(int L,int R)
{
int x;
if(R-L<=){
x=split(L,R-);
return rb[x];
}else{
x=split(L+,R-);
return ms[x];
}
}
int Build(int *a,int l,int r,int ff)
{
if(l>r) return ;
int mid=(l+r)>>,x=mid+; fa[x]=ff; val[x]=a[mid];
lb[x]=(mid==)?inf:Abs(a[mid]-a[mid-]);
rb[x]=(mid==n+)?inf:Abs(a[mid]-a[mid+]);
ch[x][]=Build(a,l,mid-,x);
ch[x][]=Build(a,mid+,r,x);
pushup(x); return x;
}
#undef root
}s;
char str[]; int main()
{
//freopen("t2.in","r",stdin);
scanf("%d%d",&n,&m);
int i,x,y,z,cnt=,de; s.init();
for(i=;i<=n;i++) a[i]=gint();
a[]=inf; a[n+]=inf;
s.ch[][]=s.Build(a,,n+,);
for(i=;i<=m;i++)
{
scanf("%s",str);
x=gint(); y=gint();
if(str[]=='e'){
s.Merge(x,y);
}else if(str[]=='n'){
s.Ins(x,y);
}else if(str[]=='a'){
/*cnt++;
if(cnt==957)
de=1;*/
printf("%d\n",s.Query_max(x,y));
}else{
printf("%d\n",s.Query_min(x,y));
}
}
return ;
}
BZOJ 4864 [BJWC2017]神秘物质 (splay)的更多相关文章
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- 【BZOJ4864】神秘物质 [Splay]
神秘物质 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input Sample Output 1 ...
- 【BZOJ4864】【BJWC2017】神秘物质 - Splay
题意: Description 21ZZ 年,冬.小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, ...
- [BZOJ4864][BeiJing2017Wc]神秘物质(splay)
首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap
神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )
这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...
随机推荐
- php 常用header
//定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...
- BFS与DFS模板
搜索问题的解法 DFS(深度优先搜索) BFS(广度优先搜索) backtracking(回溯) DFS模板 void dfs(...) { // 结束递归的条件 if (...) { ..... / ...
- 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 2
第二天 日期:2019/6/15 前言: 第2次会议在9C-405召开 进行第一天工作的检查,开始第二天工作的安排和学习 1.1 今日完成任务情况以及明天任务安排 姓名 当前阶段任务 下一阶段任务 刘 ...
- 用chrony代替ntpd时间同步服务器
Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后台运行的守护进程,用于调整内核 ...
- Updates were rejected because the remote contains work that you do(gitee报错解决方案)
今天向Gitee远程仓库提交本地项目文件时,遇到了下列错误,很是郁闷 正在推送 1203笔记本Error: failed to push some refs to 'https://gitee.com ...
- PHP学习总结(5)——PHP入门篇之PHP字符串
字符串 一个字符串是用双引号括起来的一个词或一个句字,比如:"Hi,imooc!".你可以用PHP语言输出把这个字符串输出,像这样: <?php echo "Hi, ...
- 简述Web Service通讯技术的搭建流程
Web Service 基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级 ...
- Mysql提升大数据导入速度的绝妙方法
一.对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER TABLE tblname DISABLE KEYS; loading the data A ...
- BigInteger类(高精度整型)
位置:java.math.BigInteger 作用:提供高精度整型数据类型及相关操作 一.基本介绍 BigInteger为不可变的任意精度的整数(对象创建后无法改变,每次运算均会产生一个新的对象). ...
- COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存执行原理
通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. / ...