题目


分析

最小值只需要开两棵平衡树,一棵维护所有元素,一棵维护相邻最小值,

对于全局最小值,对于每次插入查找前驱后继更新最小值即可,

相邻最小值,对于每个原数列的数维护它的开头和结尾是什么数,

然后在往后插入一个数时直接先把原来的相邻删除再加进去,

求平衡树的最小值即可


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rr register
using namespace std;
const int N=500011,inf=1e9; char str[21];
const double alp=0.75; int ans,n,m,len,St[N],Ed[N],a[N];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(int ans){
if (ans<0) putchar('-'),ans=-ans;
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed min(int a,int b){return a<b?a:b;}
inline signed max(int a,int b){return a>b?a:b;}
struct ScapeGoat_Tree{
int siz[N<<1],son[N<<1][2],root,tot=0,fat[N<<1],w[N<<1],stac[N<<1],TOP;
inline void BUILD(){
tot=2,root=1;
w[1]=-inf,siz[1]=2,son[1][1]=2,
w[2]=inf,siz[2]=1,fat[2]=1;
}
inline bool balance(int x){return alp*siz[x]>=(max(siz[son[x][0]],siz[son[x][1]]));}
inline void recycle(int x){
if (son[x][0]) recycle(son[x][0]);
stac[++TOP]=x;
if (son[x][1]) recycle(son[x][1]);
}
inline signed build(int l,int r){
if (l>r) return 0;
rr int mid=(l+r)>>1,x=stac[mid];
fat[son[x][0]=build(l,mid-1)]=x;
fat[son[x][1]=build(mid+1,r)]=x;
siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;
return x;
}
inline void rebuild(int x){
TOP=0; recycle(x);
rr int fa=fat[x],wh=son[fat[x]][1]==x;
rr int now=build(1,TOP);
fat[son[fa][wh]=now]=fa;
if (root==x) root=now;
}
inline void Insert(int x){
rr int now=root,renew=++tot;
siz[renew]=1,w[renew]=x;
while (1){
++siz[now];
rr bool wh=x>=w[now];
if (son[now][wh]) now=son[now][wh];
else {fat[son[now][wh]=renew]=now; break;}
}
rr int UP=0;
for (rr int i=renew;i;i=fat[i]) if (!balance(i)) UP=i;
if (UP) rebuild(UP);
}
inline void Delete(int x){
if (son[x][0]&&son[x][1]){
rr int now=son[x][0];
while (son[now][1]) now=son[now][1];
w[x]=w[now],x=now;
}
rr int cho=son[x][0]?son[x][0]:son[x][1],wh=son[fat[x]][1]==x;
fat[son[fat[x]][wh]=cho]=fat[x];
for (rr int i=fat[x];i;i=fat[i]) --siz[i];
if (x==root) root=cho;
}
inline signed arr(int x){
rr int now=root;
while (1){
if (w[now]==x) return now;
else now=son[now][w[now]<x];
}
}
inline signed rank(int x){
rr int now=root,ans=0;
while (now){
if (x>w[now]) ans+=siz[son[now][0]]+1,now=son[now][1];
else now=son[now][0];
}
return ans;
}
inline signed kth(int x){
rr int now=root;
while (1){
if (siz[son[now][0]]==x-1) return now;
else if (siz[son[now][0]]>=x) now=son[now][0];
else x-=siz[son[now][0]]+1,now=son[now][1];
}
}
inline signed pre(int x){
rr int now=root,ans=-inf;
while (now){
if (x>w[now]) ans=max(ans,w[now]),now=son[now][1];
else now=son[now][0];
}
return ans;
}
inline signed suf(int x){
rr int now=root,ans=inf;
while (now){
if (x<w[now]) ans=min(ans,w[now]),now=son[now][0];
else now=son[now][1];
}
return ans;
}
}Tre[2];
inline signed Abs(int x){return x<0?-x:x;}
signed main(){
n=iut(),m=iut(),Tre[0].BUILD(),Tre[1].BUILD();
for (rr int i=1;i<=n;++i) St[i]=Ed[i]=a[i]=iut();
for (rr int i=1;i<n;++i) Tre[0].Insert(Abs(St[i+1]-St[i]));
for (rr int i=1;i<=n;++i) Tre[1].Insert(St[i]);
sort(a+1,a+1+n),ans=Abs(a[2]-a[1]);
for (rr int i=3;i<=n;++i) ans=min(ans,Abs(a[i]-a[i-1]));
for (rr int i=1;i<=m;++i){
scanf("%s",str+1),len=strlen(str+1);
if (len==6){
rr int x=iut(),w=iut();
if (x<n) Tre[0].Delete(Tre[0].arr(Abs(St[x+1]-Ed[x])));
if (x<n) Tre[0].Insert(Abs(St[x+1]-w));
Tre[0].Insert(Abs(w-Ed[x])),Ed[x]=w;
rr int t1=Tre[1].suf(-inf),t2=Tre[1].pre(inf);
if (w<t1) ans=min(ans,t1-w);
else if (t2<w) ans=min(ans,w-t2);
else {
if (Tre[1].suf(w-1)==w) {ans=0; continue;}
ans=min(ans,min(w-Tre[1].pre(w),Tre[1].suf(w)-w));
}
Tre[1].Insert(w);
}else if (len==7) print(Tre[0].suf(-inf)),putchar(10);
else print(ans),putchar(10);
}
return 0;
}

#平衡树#洛谷 1110 [ZJOI2007]报表统计的更多相关文章

  1. BZOJ1058或洛谷1110 [ZJOI2007]报表统计

    BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以 ...

  2. 洛谷.1110.[ZJOI2007]报表统计(Splay Heap)

    题目链接 附纯SplayTLE代码及主要思路: /* 可以看做序列有n段,Insert是每次在每一段最后插入一个元素 只有插入,没有删除,所以插入一个元素对于询问1影响的只有该元素与前边一个元素(同段 ...

  3. 洛谷.1110.[ZJOI2007]报表统计(Multiset Heap)

    题目链接 主要思路 /* 对于询问1,用堆代替multiset/Splay 对于询问2,multiset 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一个位置,而不是这个元素!这个 ...

  4. 洛谷.1110.[ZJOI2007]报表统计(Multiset)

    题目链接 主要思路 /* 其实只需要multiset即可 对于询问1,删除.插入差值,输出最小元素 对于询问2,插入后用前驱后继更新 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一 ...

  5. 洛谷 P1110 [ZJOI2007]报表统计 解题报告

    P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...

  6. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  7. bzoj P1058 [ZJOI2007]报表统计——solution

    1058: [ZJOI2007]报表统计 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4099  Solved: 1390 [Submit][St ...

  8. 【BZOJ1058】[ZJOI2007]报表统计 STL

    [BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...

  9. [ZJOI2007]报表统计(splay,堆)

    [ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...

  10. bzoj1058: [ZJOI2007]报表统计

    set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...

随机推荐

  1. 学习go语言编程之错误处理

    error接口 Golang中有一个关于错误处理的标准模式,即:error接口. type error interface { Error() string } 对于大多数函数,如果要返回错误,大致上 ...

  2. 禁用Windows自动更新并允许手动更新

    新版的 Windows 经常会自动检查更新,然后在某个夜深人静的晚上帮你自动更新. 对于自动更新,一般的解决方案是直接禁用 Windows 更新服务.这种方式虽然关闭了自动更新,但会影响手动更新.Wi ...

  3. Java - 将TXT文本文件转换为PDF文件

    与TXT文本文件,PDF文件更加专业也更适合传输,常用于正式报告.简历.合同等场合.项目中如果有使用Java将TXT文本文件转为PDF文件的需求,可以查看本文中介绍的免费实现方法. 免费Java PD ...

  4. 通过 saltstack 批量更新 SSL 证书

    哈喽大家好,我是咸鱼. 之前写过两篇关于 SSL 过期巡检脚本的文章: SSL 证书过期巡检脚本 SSL 证书过期巡检脚本(Python 版) 这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间 ...

  5. 网络通信部分之bs/cs架构,网络概念,osi七层网络模型,TCP/UDP协议---day27

    1.网络开发的两大架构c/s,b/s # ### 1.网络开发的两大架构 a文件 -> b文件 借助c文件 a文件和b文件进行数据交流,借助c文件中转数据 a文件把数据放在c文件中,b文件从c文 ...

  6. 【算法day5】排序算法的稳定性及其汇总

    稳定性 定义:值相同的元素在排序完成之后能否保证原有的次序不变(同样值的个体之间,如果不因为排序而改变相对次序,这个排序就是有稳定性的,否则就没有) 举例: [2,1,3,1]-->[1,1,2 ...

  7. 【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?

    问题描述 为App Service For Linux配置CI/CD,源代码在GitHub私有库中,在发布时候报错 Cannot find SourceControlToken with name B ...

  8. [C++逆向] 6 函数的工作原理

    目录 栈帧的形成和关闭 各种调用方式的考察 _stdcall _cdecl _fastcall 使用ebp或者esp寻址 某次调用函数时的栈结构 函数参数 不定长参数 函数的返回值 栈帧的形成和关闭 ...

  9. 5、zookeeper应用场景-配置中心原理

    配置中心 使用 zookeeper的特性watcher监听器 工作中有这样的一个场景:数据库用户名和密码信息放在一个配置文件中,应用读取该配置文件,配置文件信息放入缓存 若数据库的用户名和密码改变时候 ...

  10. [学习笔记] Rocket.Chat 安装与设置启动项

    这篇文章主要介绍手动安装的方式来安装Rocket.Chat,在Rocket.Chat官方有三种安装方式, 面向开发人员的直接使用meteor部署 传统的源码编译安装 Docker方式部署 接下来分别介 ...