来自FallDream的博客,未经允许,请勿转载,谢谢。


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<=10^5
 
话说省夏监考的时候写题真刺激..
这道题其实是一道平衡树裸题,max操作显然是问区间最大值和最小值,min操作只要稍微脑补一下都能发现答案只可能是相邻两个相差的绝对值的最小值
所以只要开两个splay,一个维护原数组,另一个维护差分数组即可
#include<iostream>
#include<cstdio>
#define MN 200000
using namespace std;
inline int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
}
int n,m,a[MN+],b[MN+];
inline int abs(int x){return x<?-x:x;}
struct Splay
{
int cnt,c[MN+][],fa[MN+],size[MN+],mx[MN+],mn[MN+],rt,s[MN+];
void update(int x)
{
int l=c[x][],r=c[x][];
mx[x]=mn[x]=s[x];size[x]=size[l]+size[r]+;
if(l) mx[x]=max(mx[x],mx[l]),mn[x]=min(mn[x],mn[l]);
if(r) mx[x]=max(mx[x],mx[r]),mn[x]=min(mn[x],mn[r]);
}
int build(int*a,int l,int r)
{
if(l>r)return ;
int mid=l+r>>;s[mid]=a[mid];
c[mid][]=build(a,l,mid-);fa[c[mid][]]=mid;
c[mid][]=build(a,mid+,r);fa[c[mid][]]=mid;
update(mid);
return mid;
}
void rotate(int x,int&k)
{
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
if(y==k) k=x; else c[z][c[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
update(y);update(x);
}
void splay(int x,int&k)
{
for(;x!=k;rotate(x,k))
if(fa[x]!=k) rotate(c[fa[fa[x]]][]==fa[x]^c[fa[x]][]==x?x:fa[x],k);
}
int Find(int x,int rk)
{
int Sz=size[c[x][]]+;
if(Sz==rk) return x;
if(Sz>rk) return Find(c[x][],rk);
else return Find(c[x][],rk-Sz);
}
int Split(int l,int r)
{
splay(Find(rt,l),rt);
splay(Find(rt,r),c[rt][]);
return c[c[rt][]][];
}
void Modify(int x,int rk,int v)
{
int Sz=size[c[x][]]+;
if(Sz==rk){s[x]=v;update(x);return;}
else if(Sz<rk) Modify(c[x][],rk-Sz,v);
else Modify(c[x][],rk,v);
update(x);
}
void ins(int&x,int rk,int v,int last)
{
if(!x){x=++cnt;s[x]=mx[x]=mn[x]=v;size[x]=v;fa[x]=last;return;}
int Sz=size[c[x][]]+;
if(Sz<=rk) ins(c[x][],rk-Sz,v,x);
else ins(c[x][],rk,v,x);
update(x);
}
}s,S;
char op[];
int main()
{
n=read();m=read();
for(int i=;i<=n;++i) a[i+]=read(),b[i]=abs(a[i+]-a[i]);
s.rt=s.build(a,,n+);S.rt=S.build(b,,n+);
s.cnt=n+;S.cnt=n+;
for(int i=;i<=m;++i)
{
scanf("%s",op+);int x=read(),y=read();
if(op[]=='e')
{
int z=s.Split(x,x+);S.Split(x,x+);
S.c[S.c[S.rt][]][]=s.c[z][]=s.c[z][]=;
S.s[S.rt]=abs(y-s.s[s.rt]);S.s[S.c[S.rt][]]=abs(s.s[s.c[s.rt][]]-y);
S.update(S.c[S.rt][]);S.update(S.rt);
s.s[z]=y;s.update(z);s.update(s.c[s.rt][]);s.update(s.rt);
}
if(op[]=='n')
{
int b=s.Find(s.rt,x+),a=s.Find(s.rt,x+);
s.ins(s.rt,x+,y,);s.splay(s.cnt,s.rt);
S.Modify(S.rt,x+,abs(y-s.s[b]));
S.ins(S.rt,x+,abs(s.s[a]-y),);S.splay(S.cnt,S.rt);
}
if(op[]=='a')
{
int X=s.Split(x,y+);
printf("%d\n",s.mx[X]-s.mn[X]);
}
if(op[]=='i')
{
int X=S.Split(x,y+);
printf("%d\n",S.mn[X]);
}
}
return ;
}

[bzoj4864][BeiJing 2017 Wc]神秘物质的更多相关文章

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

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

  2. BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap

    题目描述 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. itchat 微信的使用

    #coding=utf8 import itchat # 自动回复 # 封装好的装饰器,当接收到的消息是Text,即文字消息 @itchat.msg_register('Text') def text ...

  2. SENet

     \(\bf F_{tr}\) 为标准卷积操作 \(\bf F_{sq}\) 为 Global Average Pooling \(\bf F_{ex}\) 为两层全连接网络(可以看做两个1×1卷积 ...

  3. mongo数据库的常见操作

    连接mongodb数据库的命令查看对应数据库mongo.exeuse shujukuming;db.opportunity.findOne({"id":5}); db.opport ...

  4. Mego(1) - NET中主流ORM框架性能对比

    从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...

  5. 新概念英语(1-117)Tommy's breakfast

    Lesson 117  Tommy's breakfast 汤米的早餐 Listen to the tape then answer this question. What does she mean ...

  6. Python之几种常用模块

    模块 注意事项: 所有的模块导入都应该尽量往上写 内置模块 扩展模块 自定义模块 模块不会重复被导入 : sys.moudles 从哪儿导入模块 : sys.path import import 模块 ...

  7. vue computed 原理

    vue computed 主要依靠数据依赖来更新,这里不展示computed源代码,只展示核心思想. computed: { a(){ return this.b ++ } } data:{ b: 1 ...

  8. R数据分析 第一篇:温习概率论

    概率论是人们在长期实践中发现的理论,是客观存在的.自然界和社会上发生的现象是多种多样的,有一类现象,在一定条件下必然发生,称作确定性现象,而概率论研究的现象是不确定性现象,嗯嗯,醒醒,概率论研究的对象 ...

  9. Vue框架下的node.js安装教程

    Vue框架下的node.js安装教程 python服务器.php  ->aphche.java ->tomcat.   iis -->它是一个可以运行JAVASCRIPTR 的运行环 ...

  10. *args和**kwargs

    #coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...