BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质
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 的子区间。
小诚坚信这项研究可以获得诺贝尔物理学奖。为了让小诚早日了结心愿,你能否帮助他实现上述的观测和测量呢?
Input
第一行, 两个整数 N, M, 分别表示最初的原子数目和事件总数。
第二行, N 个整数 E1, E2, …, EN, 由空格隔开。依次表示每个原子的能量。
接下来 M 行, 每行为一个字符串和两个整数, 描述一次事件,格式见题目描述。
N<=100,000,M<=100,000
1 ≤ e, Ei ≤ 109。 设 N’ 为当前时刻原子数目。
对于 merge 类事件, 1 ≤ x ≤ N’-1;
对于 insert 类事件, 1 ≤ x ≤ N’;
对于 max 和 min 类事件, 1 ≤ x < y ≤ N’。
任何时刻,保证 N’ ≥ 2。
Output
输出若干行, 按顺序依次表示每次 max 和 min 类事件的测量结果。
平衡树sb题,但是我比较sb,所以写了两个小时
注意极差的最小值指的是最大值的最小值,不是区间差的最小值。
所以维护每个元素与下一个元素的差值的区间最小值即可。
写起来还是有不少细节的。
Code:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <algorithm>
#define ls ch[now][0]
#define rs ch[now][1]
const int N=2e5+10;
const int inf=0x7fffffff;
int ch[N][2],siz[N],val[N],mx[N],mi[N],dat[N],dmi[N],d[N],root,n,m,tot;
using std::min;
using std::max;
void updata(int now)
{siz[now]=siz[ls]+siz[rs]+1;mx[now]=max(dat[now],max(mx[ls],mx[rs]));mi[now]=min(dat[now],min(mi[ls],mi[rs]));dmi[now]=min(d[now],min(dmi[ls],dmi[rs]));
}
void split(int now,int k,int &x,int &y)
{if(!now) {x=y=0;return;}if(siz[ls]<k)x=now,split(rs,k-siz[ls]-1,rs,y);elsey=now,split(ls,k,x,ls);updata(now);
}
int Merge(int x,int y)
{if(!x||!y) return x+y;if(val[x]<val[y]){ch[x][1]=Merge(ch[x][1],y);updata(x);return x;}else{ch[y][0]=Merge(x,ch[y][0]);updata(y);return y;}
}
int getleft(int now)
{if(!now) return inf;while(ls) now=ls;return dat[now];
}
int New(int e,int de)
{siz[++tot]=1,val[tot]=rand(),mx[tot]=mi[tot]=dat[tot]=e,d[tot]=dmi[tot]=(de==inf?de:abs(de-e));return tot;
}
void insert(int k,int e)
{int x,y,z;split(root,k,x,y);if(k){split(x,k-1,x,z);dmi[z]=d[z]=abs(dat[z]-e);x=Merge(x,z);}root=Merge(Merge(x,New(e,getleft(y))),y);
}
void extrack(int k)
{int x,y,z;split(root,k,x,y);split(x,k-1,x,z);if(k>1){split(x,k-2,x,z);int de;if((de=getleft(y))==inf)dmi[z]=d[z]=inf;elsedmi[z]=d[z]=abs(de-dat[z]);x=Merge(x,z);}root=Merge(x,y);
}
void merge(int k,int e)
{extrack(k),extrack(k),insert(k-1,e);
}
void query(int l,int r,int typ)
{int x,y,z,p;split(root,r,x,y);split(x,l-1,x,z);if(typ) printf("%d\n",mx[z]-mi[z]);else split(z,r-l,z,p),printf("%d\n",dmi[z]),z=Merge(z,p);root=Merge(Merge(x,z),y);
}
int main()
{//freopen("data.in","r",stdin);//freopen("dew.out","w",stdout);//srand(time(0));scanf("%d%d",&n,&m);mi[0]=d[0]=dmi[0]=inf;for(int e,i=1;i<=n;i++)scanf("%d",&e),insert(i-1,e);char op[9];for(int x,y,i=1;i<=m;i++){scanf("%s%d%d",op,&x,&y);if(op[1]=='e') merge(x,y);else if(op[1]=='n') insert(x,y);else query(x,y,op[1]=='a');}return 0;
}
2018.12.11
转载于:https://www.cnblogs.com/butterflydew/p/10100814.html
BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告相关推荐
- [BZOJ]4864: [BeiJing 2017 Wc]神秘物质
题解: 操作1 分解为删除一个元素和修改一个元素的权值 操作2:插入一个元素 操作3:查询区间里面子区间的极差最大值 等价于直接求区间最大值减去区间最小值 操作4:查询区间子区间里面极差最小值 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- bzoj 4864: [BeiJing 2017 Wc]神秘物质 splay
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- 4864: [BeiJing 2017 Wc]神秘物质
4864: [BeiJing 2017 Wc]神秘物质 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 92 Solved: 50 [Submit][S ...
- bzoj4864: [BeiJing 2017 Wc]神秘物质
4864: [BeiJing 2017 Wc]神秘物质 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 99 Solved: 56 [Submit] ...
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- 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 ...
最新文章
- angular绑定数据_Angular中的数据绑定说明
- hdu 3613 扩展kmp+回文串
- relativelayout设置边框_Android表格布局之设置边框
- 音视频技术开发周刊(第130期)
- mysql path conflict_yum安装MySQL出现conflict problem
- python中 numpy_Python中的Numpy
- IE 加速插件之 Google Chrome Frame
- LeetCode50. Pow(x, n)(二进制位运算)
- BZOJ 1571: [Usaco2009 Open]滑雪课Ski
- 企业API接口设计之token、timestamp、sign具体实现
- ubuntu scrt
- c语言 dirent,dirent / opendir(), readdir()
- 阿里语音识别(语音转文字)java调用全程手把手详解-适合中小学生快速上手
- 电子商务网络购物平台实例运营分析+电子商务概述及阿里巴巴集团模式五大核心内容[连载之电子商务网络营销]...
- 【DBSDFZOJ 4370】小宁的机器人(模拟)
- 看看十二星座哪个更适合当程序员
- STM32cubemx——超声波测距
- 智能共享口红机方案/案列/APP/小程序/开发
- 最要紧的是,我们首先要善良,其次是要诚实,再次是以后永远不要相互遗忘。...
- MySQL编码致使varchar类型不区分大小写