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 ...
随机推荐
- 【BZOJ1367】【Baltic2004】sequence - 可合并堆
题意: 题解: 其实这是道水题啦……只不过我没做过而已 先考虑构造不严格递增序列,考虑原序列中的一段下降区间,显然区间中的$z$全取中位数最优: 那么可以把原序列拆成很多个下降序列,从头到尾加入原序列 ...
- CodeForces-546D Soldier and Number Game 筛法+动态规划
题目链接:https://cn.vjudge.net/problem/CodeForces-546D 题意 抱歉,我给忘了,现在看题目又看不懂: P 思路 筛法+dp 话说这个函数应该是积性函数,然后 ...
- NOIP2016 DAY2 T1 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- Elasticsearch 入门 - Modifying Your Data
index/update/delete 均有大概1秒的缓存时间 Indexing/Replacing Documents curl -X PUT "localhost:9200/custom ...
- django-6-数据库配置及模型创建,激活(django模型系统1)
<<<数据库的连接配置>>> django配置mysql的流程: 1.创建数据库用户 (1)进入MySQL数据库 (2)创建有数据库权限的用户 (3)退出My ...
- 2015 Multi-University Training Contest 8 hdu 5385 The path
The path Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5 ...
- CSS BFC学习笔记
BFC,全称是Block Formatting Context,块级格式化上下文. 详细是什么,能够理解为页面元素的一种特性.触发了BFC的元素往往会产生一些对刚開始学习的人而言意想不到的效果. 触发 ...
- struts2提交多个对象带图片
一:实体类 二:前台页面 三:Action处理
- 程序猿爱情表白专用html5动画网页的代码
程序猿爱情表白专用html5动画网页的代码 下载地址:源代码 程序员表白专用的html5动画特效网页,真的挺羡慕创作者的水平,有这水平能够把爱表白给想表白的人,不要以为那些鲜花是用 的图片.你会发如今 ...
- 串口之CreateFile 函数具体解释
HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名称的指针 DWORD dwDesiredAccess, //訪问模式(写/读) DWORD dwShareM ...