题意:

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,0001 ≤ e, Ei ≤ 109。
设 N’ 为当前时刻原子数目。对于 merge 类事件, 1 ≤ x ≤ N’-1;
对于 insert 类事件, 1 ≤ x ≤ N’;
对于 max 和 min 类事件, 1 ≤ x < y ≤ N’。
任何时刻,保证 N’ ≥ 2。

Output

输出若干行, 按顺序依次表示每次 max 和 min 类事件的测量结果。

题解:

看到merge和insert操作肯定是splay维护啦……

考虑如何处理询问,极差最大值肯定是区间最大值减最小值,这个不用说;

极差最小值呢?

结论是极差最小值一定是两个相邻的数之差;

考虑三个数,肯定选中间的数和与其差较小的另一个数极差最小,三个数都选不会优于这个选择,类似归纳即可;

那么splay维护子树最大/最小值,前驱后继和子树内最小极差,pushup的时候搞搞即可。

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 1000000007
#define eps 1e-9
using namespace std;
typedef long long ll;
typedef double db;
struct node{
int son[],fa,v,l,r,siz,mi,mx,mm;
}t[];
int n,m,x,y,rt,cnt,num[];
char op[];
bool Son(int u){
return t[t[u].fa].son[]==u;
}
void pushup(int u){
t[u].l=t[u].son[]?t[t[u].son[]].l:u;
t[u].r=t[u].son[]?t[t[u].son[]].r:u;
t[u].siz=t[t[u].son[]].siz+t[t[u].son[]].siz+;
t[u].mx=max(t[u].v,max(t[t[u].son[]].mx,t[t[u].son[]].mx));
t[u].mi=min(t[u].v,min(t[t[u].son[]].mi,t[t[u].son[]].mi));
t[u].mm=min(min(t[t[u].son[]].mm,t[t[u].son[]].mm),min(t[u].son[]?abs(t[u].v-t[t[t[u].son[]].r].v):inf,t[u].son[]?abs(t[u].v-t[t[t[u].son[]].l].v):inf));
}
int build(int l,int r,int ff){
int mid=(l+r)/;
t[mid].fa=ff;
if(l<mid)t[mid].son[]=build(l,mid-,mid);
if(mid<r)t[mid].son[]=build(mid+,r,mid);
pushup(mid);
return mid;
}
void rotate(int u){
int f=t[u].fa,ff=t[f].fa,ch=Son(u),cf=Son(f);
t[f].son[ch]=t[u].son[ch^];
t[t[f].son[ch]].fa=f;
t[ff].son[cf]=u;
t[u].son[ch^]=f;
t[u].fa=ff;
t[f].fa=u;
pushup(f);
pushup(u);
}
void splay(int u,int to){
for(;t[u].fa!=to;rotate(u)){
int f=t[u].fa;
if(t[f].fa!=to)rotate(Son(u)^Son(f)?u:f);
}
if(!to)rt=u;
}
int findx(int u,int k){
int nw=u;
for(;;){
if(t[t[nw].son[]].siz+==k)return nw;
if(k<=t[t[nw].son[]].siz){
nw=t[nw].son[];
}else{
k-=t[t[nw].son[]].siz+;
nw=t[nw].son[];
}
}
}
int split(int x,int y){
int l=findx(rt,x-),r=findx(rt,y+);
//printf("%d %d\n",l,r);
splay(l,);
splay(r,rt);
return t[t[rt].son[]].son[];
}
void merge(int x,int y){
int u=split(x+,x+);
t[u].v=y;
t[u].son[]=t[u].son[]=;
pushup(u);
pushup(t[rt].son[]);
pushup(rt);
}
void ins(int x,int y){
int u=split(x+,x+);
t[t[rt].son[]].son[]=++cnt;
t[cnt].fa=t[rt].son[];
t[cnt].v=y;
pushup(cnt);
pushup(t[rt].son[]);
pushup(rt);
}
int getmx(int x,int y){
int u=split(x+,y+);
return t[u].mx-t[u].mi;
}
int getmi(int x,int y){
int u=split(x+,y+);
return t[u].mm;
}
int main(){
scanf("%d%d",&n,&m);
cnt=n+;
for(int i=;i<=n;i++){
scanf("%d",&t[i+].v);
}
t[].mx=;
t[].mi=t[].mm=inf;
cnt=n+;
rt=build(,n+,);
for(int i=;i<=m;i++){
scanf("%s%d%d",op,&x,&y);
if(op[]=='e'){
merge(x,y);
}else if(op[]=='n'){
ins(x,y);
}else if(op[]=='a'){
printf("%d\n",getmx(x,y));
}else{
printf("%d\n",getmi(x,y));
}
}
return ;
}

【BZOJ4864】【BJWC2017】神秘物质 - Splay的更多相关文章

  1. 【BZOJ4864】神秘物质 [Splay]

    神秘物质 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input Sample Output 1 ...

  2. [BZOJ4864][BeiJing2017Wc]神秘物质(splay)

    首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...

  3. BZOJ 4864 [BJWC2017]神秘物质 (splay)

    题目大意: 让你维护一个序列,支持: 1.合并两个相邻的数为一个新的数 2.在某个位置插入一个数 3.查询一个区间的任意子区间极差的最大值 4.查询一个区间的任意子区间极差的最小值 前两个操作可以用$ ...

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

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

  5. [bzoj4864][BeiJing2017Wc]神秘物质_非旋转Treap

    神秘物质 bzoj-4864 BeiJing-2017-Wc 题目大意:给定一个长度为n的序列,支持插入,将相邻两个元素合并并在该位置生成一个指定权值的元素:查询:区间内的任意一段子区间的最大值减最小 ...

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

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

  7. 【bzoj4864】神秘物质

    Description 给出一个长度为n的序列,第i个数为ai,进行以下四种操作: merge x e:将当前第x个数和第x+1个数合并,得到一个新的数e: insert x e:在当前第x个数和第x ...

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

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

  9. BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告

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

随机推荐

  1. linux 中使用iptables 防止ddocs及cc攻击配置 。

    #防止SYN攻击,轻量级预防 iptables -N syn-floodiptables -A INPUT -p tcp –syn -j syn-floodiptables -I syn-flood ...

  2. codevs——T1219 骑士游历

     http://codevs.cn/problem/1219/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Desc ...

  3. 【cl】selenium实例一:打开百度,获取第四个标题

    /*创建类的时候是TestNG Class*/ package Selenium_lassen; import static org.junit.Assert.*; import java.util. ...

  4. java泛型具体解释

    为什么引入泛型 bug是编程的一部分,我们仅仅能尽自己最大的能力降低出现bug的几率,可是谁也不能保证自己写出的程序不出现不论什么问题. 错误可分为两种:编译时错误与执行时错误.编译时错误在编译时能够 ...

  5. c22---枚举

    // // main.c // 枚举基本概念 #include <stdio.h> int main(int argc, const char * argv[]) { // int sex ...

  6. nyoj--252--01串(水题)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这种长度的0 ...

  7. 自然语言处理(NLP)书籍资源清单

    1. 书籍 入门: <Speech and Language Processing>Dan Jurafsky ,James H. Martin 2. blog及项目

  8. [Pulgin] 前端上传组件Plupload使用指南

    我之前写过一篇文章<文件上传利器SWFUpload使用指南>,里面介绍了上传组件SWFUpload的使用方法,但现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SW ...

  9. 虚拟机CentOS设置IP

    虚拟机里Centos7的IP地址查看方法 本地虚拟机安装了CentOS 7,想通过ftp上传文件,发现通过ifconfig,没有inet这个属性 查看ens33网卡的配置:vi /etc/syscon ...

  10. Hadoop MapReduce编程 API入门系列之最短路径(十五)

    不多说,直接上代码. ======================================= Iteration: 1= Input path: out/shortestpath/input. ...