来自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. iOS开发-OC数据类型

    以下是OC中的实例,Swift部分不适用 iOS中的注释 // 单行注释 // 注释对代码起到解释说明的作用,注释是给程序员看的,不参与程序运行 /*  多行注释   Xcode快捷键   全选 cm ...

  2. 国内maven仓库地址 || 某个pom或者jar找不到的解决方法

    解决方法 建议在maven仓库中新建settings.xml,然后把如下内容粘贴进去即可.也可以找到maven的安装目录中的conf/settings.xml,把如下的mirrors节复制到对应部分. ...

  3. 阿里云API网关(14)流控策略

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  4. Django 框架介绍

    Django 框架介绍 MVC框架和MTV框架 简单了解一下什么是MVC框架.MVC(Model View Controller),是模型(model)-视图(view)-控制器(controller ...

  5. github生成SSH公钥

    ssh-keygen -t rsa -C "your_email@youremail.com" 然后输入github上的密码 Enter passphrase (empty for ...

  6. CWMP开源代码研究——stun的NAT穿透

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 参考: http://www.cnblogs.com/myblesh/p/6259765.htm ...

  7. Java-NIO(三):直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...

  8. Typescript学习

    一 什么是Typescript 简单的说,TypeScript 是 JavaScript 的一个超集,主要提供了类型系统和对 ES6 的支持,它由 Microsoft 开发,代码开源于 GitHub  ...

  9. Map 接口简明

    Map 接口并没有继承Collection接口 HashMap : 哈希表数据结构,是线程不同步的,快速.允许存储 null 键,null 值.替代了 Hashtable. LinkedHashMap ...

  10. Linux查看文件指定某些行的内容

    查看从第5行开始的100行内容,并把结果重定向到一个新的文件 cat file | tail -n +5 | head -n 100 > newfile.txt 查看第5行到100行的内容,并把 ...