Description
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 的子区间。
小诚坚信这项研究可以获得诺贝尔物理学奖。为了让小诚早日了结心愿,你能否帮助他实现上述的观测和测量呢?

合并(删除两个节点,加入一个节点)和插入(加入一个节点)的操作我们直接用Splay维护即可,考虑如何计算答案。

区间极差的最大值我们可以记录区间最大和区间最小。

区间极差的最小值肯定是由相邻两个数的差得到,我们记录一个区间中相邻两个数的差最小是多少。

因为在Splay的时候,两个数的差是不会变的,所以我们就可以将两个数的差统一维护在平衡树的左(右)节点。

询问时查询即可。

#include<bits/stdc++.h>
#define N 100010
using namespace std;
struct data
{int size,fa,ch[2],maxn,minn,change,minchange,val;
}tree[N<<2];
int n,m,x,y,rt,cnt;
char s[11];
void up(int hao)//以下是基本操作
{tree[hao].maxn=max(tree[hao].val,max(tree[tree[hao].ch[0]].maxn,tree[tree[hao].ch[1]].maxn));tree[hao].minn=min(tree[hao].val,min(tree[tree[hao].ch[0]].minn,tree[tree[hao].ch[1]].minn));tree[hao].minchange=min(tree[hao].change,min(tree[tree[hao].ch[0]].minchange,tree[tree[hao].ch[1]].minchange));tree[hao].size=tree[tree[hao].ch[0]].size+tree[tree[hao].ch[1]].size+1;
}
void rotate(int x,int &y)
{int fa1=tree[x].fa,gfa=tree[fa1].fa,d1=(tree[tree[x].fa].ch[1]==x),d2=(tree[tree[fa1].fa].ch[1]==fa1);if(fa1==y){y=x;}else{tree[gfa].ch[d2]=x;}tree[x].fa=gfa;tree[fa1].ch[d1]=tree[x].ch[d1^1];tree[tree[x].ch[d1^1]].fa=fa1;tree[x].ch[d1^1]=fa1;tree[fa1].fa=x;up(fa1);up(x);
}
void splay(int u,int &v)
{while(u!=v){int fa1=tree[u].fa,fa2=tree[fa1].fa;if(fa1!=v){if((tree[fa2].ch[0]==fa1)^(tree[fa1].ch[0]==u)){rotate(u,v);}else{rotate(fa1,v);}}rotate(u,v);}
}
void build(int hao,int l,int r)//建树
{if(r<l){return;}int mid=(l+r)/2;tree[mid].fa=hao;tree[hao].ch[mid>hao]=mid;build(mid,l,mid-1);build(mid,mid+1,r);up(mid);
}
int find(int hao,int y)//找到覆盖这个区间的数的编号
{if(!hao){return 0;}if(tree[tree[hao].ch[0]].size+1>y){return find(tree[hao].ch[0],y);}else{if(tree[tree[hao].ch[0]].size+1<y){return find(tree[hao].ch[1],y-tree[tree[hao].ch[0]].size-1);}else{return hao;}}
}
int main()
{//  freopen("1.txt","r",stdin);scanf("%d%d",&n,&m);tree[0].minn=tree[0].minchange=214748364;for(int i=2;i<=n+1;i++){scanf("%d",&tree[i].val);}for(int i=2;i<=n+1;i++){tree[i].change=abs(tree[i].val-tree[i+1].val);}cnt=n+2;rt=(cnt+1)/2;build(rt,1,rt-1);build(rt,rt+1,cnt);up(rt);for(int i=1;i<=m;i++){scanf("%s%d%d",s,&x,&y);if(s[1]=='e'){splay(find(rt,x+1),rt);splay(find(rt,x+3),tree[rt].ch[1]);//把区间旋转上来tree[tree[rt].ch[1]].ch[0]=0;up(tree[rt].ch[1]);tree[rt].val=y;tree[rt].change=abs(tree[tree[rt].ch[1]].val-y);splay(find(rt,x),tree[rt].ch[0]);tree[tree[rt].ch[0]].change=abs(tree[tree[rt].ch[0]].val-y);up(tree[rt].ch[0]);up(rt);}else{if(s[1]=='i')//两个询问操作{splay(find(rt,x),rt);splay(find(rt,y+1),tree[rt].ch[1]);printf("%d\n",tree[tree[tree[rt].ch[1]].ch[0]].minchange);}else{if(s[1]=='a'){splay(find(rt,x),rt);splay(find(rt,y+2),tree[rt].ch[1]);printf("%d\n",tree[tree[tree[rt].ch[1]].ch[0]].maxn-tree[tree[tree[rt].ch[1]].ch[0]].minn);}else{//直接插入splay(find(rt,x+1),rt);splay(find(rt,x+2),tree[rt].ch[1]);tree[tree[rt].ch[1]].ch[0]=++cnt;tree[cnt].fa=tree[rt].ch[1];tree[cnt].val=y;tree[cnt].change=abs(tree[cnt].val-tree[tree[cnt].fa].val);tree[rt].change=abs(tree[rt].val-tree[cnt].val);up(cnt);up(tree[rt].ch[1]);up(rt);}}}}return 0;
}

【BZOJ4864】【BeiJing 2017 Wc】神秘物质(Splay)相关推荐

  1. BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)

    Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...

  2. 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay

    [BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...

  3. bzoj4864: [BeiJing 2017 Wc]神秘物质

    4864: [BeiJing 2017 Wc]神秘物质 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 99  Solved: 56 [Submit] ...

  4. 【bzoj4864】[BeiJing 2017 Wc]神秘物质 Splay

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801631.html 题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借 ...

  5. bzoj4864 [BeiJing 2017 Wc]神秘物质

    (http://www.elijahqi.win/2018/01/26/bzoj4864-beijing-2017-wc%E7%A5%9E%E7%A7%98%E7%89%A9%E8%B4%A8/%20 ...

  6. bzoj 4864: [BeiJing 2017 Wc]神秘物质 splay

    Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...

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

    题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始 ...

  8. BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay

    BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...

  9. 4864: [BeiJing 2017 Wc]神秘物质

    4864: [BeiJing 2017 Wc]神秘物质 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 92 Solved: 50 [Submit][S ...

  10. [BZOJ]4864: [BeiJing 2017 Wc]神秘物质

    题解:  操作1 分解为删除一个元素和修改一个元素的权值 操作2:插入一个元素 操作3:查询区间里面子区间的极差最大值  等价于直接求区间最大值减去区间最小值 操作4:查询区间子区间里面极差最小值  ...

最新文章

  1. Sublime Text3 使用
  2. Linux有时会出现“You have new mail in /var/spool/mail/root”
  3. java基础系列:集合入门
  4. [JavaWeb-Servlet]概述与快速入门
  5. linux的常用操作——vim和vi
  6. python 最小二乘法_最小二乘法及其python实现详解
  7. symbian获取中文的拼音
  8. 企业私有云应用之使用OZ制作openstack镜像
  9. 网络对抗技术 实验二
  10. Supporting hyperplane
  11. Updating Scoop 遇到问题
  12. 我在名牌大学毕业后的经历——曾经努力过,就不会后悔
  13. jupyter notebook如何导入excel数据
  14. # 2gether 在一起 # 2 号星际碎片现身,全军出击!
  15. 图像检索:INS视觉检索
  16. 利用阿里云ECS制作个人简历网站
  17. Colab 快速上传数据集方法
  18. windbg符号下载
  19. USB电路EMC设计标准电路详解
  20. 网页状态码(HTTP状态码)。

热门文章

  1. Win10,Win11系统安全中心提醒“找到可能不需要的应用”弹窗,如何关闭?
  2. Jasper(1)——入门
  3. java supplier接口_Java函数式接口Supplier接口实例详解
  4. 读取xml文件信息并存入数据库
  5. 孙陶然:只有不到十分之一的人适合创业
  6. 什么是RGB模式与BGR模式
  7. 遇到bug我们如何分析定位?
  8. MATLAB控制系统仿真与CAD
  9. 基于GIS+AI、GIS+AR、GIS+三维的智慧城管综合应用平台
  10. 自动驾驶之——CAN总线简介