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);
else
y=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;
else
dmi[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

BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告的更多相关文章

  1. BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )

    这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...

  2. #4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]

    这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ ...

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

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

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

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

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

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

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

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...

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

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

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

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

  9. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

随机推荐

  1. git remote: error: hook declined to update

    提交一个项目,push的时候,报错: remote: error: File xxx.rar is MB; this exceeds Git@OSC's file size limit of 100 ...

  2. 我们一起学习WCF 第五篇数据协定和消息协定

    A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...

  3. 一起来做Chrome Extension《一些问题》

    目录 Unchecked runtime.lastError: The message port closed before a response wa received. 使用 eval Conte ...

  4. 【Jmeter测试】如何使用CSV Data Set Config获取参数

      Jmeter提供CSV Data Set Config作为参数获取的一种方式​ ​ 1.文件名:csv文件的绝对路径2.文件编码:根据运行环境设置,个人常用的是mac和linux,所以这里选择UT ...

  5. MySQL数据库--连接

    MySQL数据库的概念: MySQL数据库,包括客户端和服务端.客户端就是操作数据库的终端(命令行.navicat),服务端就是安装有MySQL软件的主机(本机或者服务器),MySQL数据库的端口一般 ...

  6. 微软职位内部推荐-Software Engineer II-Data Mining

    微软近期Open的职位: Are you looking for a big challenge? Do you know why Big Data is the next frontier for ...

  7. 四则运算3+psp0

    题目要求: 1.程序可以判断用户的输入答案是否正确,如果错误,给出正确答案,如果正确,给出提示. 2.程序可以处理四种运算的混合算式. 3.要求两人合作分析,合作编程,单独撰写博客. 团队成员:张绍佳 ...

  8. MySql 8 命令

    1-创建用户 create user 用户名@'%' identified by '密码'; create user 用户名@'localhost' identified by '密码';   2-授 ...

  9. struts2--上传总结(限制大小和类型 非法上传的跳转)

    网上有很多版本,鉴于实践出真知的态度 我自己探索了一番 struts版本:2.3.16 限制大小: struts2默认是2M 所以如果要扩大大小限制,应该先配一个全局struts2最大上限 <c ...

  10. 给个理由走下去——读《我是一只IT小小鸟》有感

    和很多人一样,高考失利,迷迷茫茫的走进了软件学院.关于这个专业,具体学什么是一概不知,只知道学软件的很帅很帅,幻想着以后当个行侠仗义的黑客,或是开发一款自己的游戏都是十分诱惑人的.然而这个世界有个不成 ...