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

第一次自己写块状链表,蛮好写,就是长。。然后就BZOJ rank1了(2019.5.11求不打脸 )

CODE

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
char ch; for(;!isdigit(ch=getc()););
for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0');
}
const int Bsz = 500;
const int Cnt = 500;
const int inf = 0x3f3f3f3f; stack<int>bin;
int n, q, num[MAXN], m;
struct Block{
int a[Bsz+5], use, nxt;
int mx, mn, d;
Block() {
memset(a, 0, sizeof a);
use = nxt = 0;
mx = 0, mn = d = inf;
}
inline void Clear() {
memset(a, 0, sizeof a);
use = nxt = 0;
mx = 0, mn = d = inf;
}
inline void getmax() {
mx = 0, mn = d = inf;
for(int i = 1; i <= use; ++i) {
mx = max(mx, a[i]),
mn = min(mn, a[i]);
if(i > 1) d = min(d, abs(a[i]-a[i-1]));
}
}
}b[Cnt+5];
inline int Query1(int x, int y) {
int l = 1;
while(x > b[l].use) x -= b[l].use, y -= b[l].use, l = b[l].nxt;
int r = l;
while(y > b[r].use) y -= b[r].use, r = b[r].nxt;
int Mx = 0, Mn = inf;
if(l == r) {
for(int i = x; i <= y; ++i)
Mx = max(Mx, b[l].a[i]),
Mn = min(Mn, b[l].a[i]);
return Mx-Mn;
}
for(int i = x; i <= b[l].use; ++i)
Mx = max(Mx, b[l].a[i]),
Mn = min(Mn, b[l].a[i]);
for(int i = 1; i <= y; ++i)
Mx = max(Mx, b[r].a[i]),
Mn = min(Mn, b[r].a[i]);
for(int i = b[l].nxt; i != r; i = b[i].nxt)
Mx = max(Mx, b[i].mx),
Mn = min(Mn, b[i].mn);
return Mx-Mn;
}
inline int Query2(int x, int y) {
int l = 1;
while(x > b[l].use) x -= b[l].use, y -= b[l].use, l = b[l].nxt;
int r = l;
while(y > b[r].use) y -= b[r].use, r = b[r].nxt;
int re = inf;
if(l == r) {
for(int i = x; i < y; ++i)
re = min(re, abs(b[l].a[i]-b[l].a[i+1]));
return re;
}
for(int i = x; i < b[l].use; ++i)
re = min(re, abs(b[l].a[i]-b[l].a[i+1]));
for(int i = 1; i < y; ++i)
re = min(re, abs(b[r].a[i]-b[r].a[i+1]));
for(int i = b[l].nxt; i != r; i = b[i].nxt)
re = min(re, b[i].d);
for(int i = l; i != r; i = b[i].nxt)
re = min(re, abs(b[i].a[b[i].use]-b[b[i].nxt].a[1]));
return re;
}
inline int Newnode() {
int re;
if(!bin.empty()) re = bin.top(), bin.pop();
else re = ++m;
b[re].Clear();
return re;
}
inline void Merge(int x, int val) {
int l = 1, pre = 0;
while(x > b[l].use) x -= b[l].use, pre = l, l = b[l].nxt;
if(x == b[l].use) {
int tmp = b[l].nxt;
b[tmp].a[1] = val;
b[tmp].getmax(); if(--b[l].use) b[l].getmax();
else b[pre].nxt = b[l].nxt, bin.push(l);
}
else {
b[l].a[x+1] = val;
--b[l].use;
for(int i = x; i <= b[l].use; ++i)
b[l].a[i] = b[l].a[i+1];
b[l].getmax();
}
}
inline void Insert(int x, int val) {
int l = 1, pre = 0;
while(x > b[l].use) x -= b[l].use, pre = l, l = b[l].nxt;
++b[l].use;
for(int i = b[l].use; i > x+1; --i) b[l].a[i] = b[l].a[i-1];
b[l].a[x+1] = val;
if(b[l].use > Bsz) {
int tmp = Newnode();
b[tmp].nxt = b[l].nxt; b[l].nxt = tmp;
b[tmp].use = b[l].use/2;
b[l].use -= b[tmp].use;
for(int i = 1; i <= b[tmp].use; ++i)
b[tmp].a[i] = b[l].a[b[l].use+i];
b[l].getmax(), b[tmp].getmax();
}
else b[l].getmax();
}
int main () {
read(n), read(q);
for(int i = 1; i <= n; ++i)
read(num[i]);
for(int i = 1; i*Bsz <= n; ++i) {
b[++m].use = Bsz; b[m-1].nxt = m;
for(int j = 1; j <= b[m].use; ++j)
b[m].a[j] = num[(m-1)*Bsz + j];
b[m].getmax();
}
if(n%Bsz) {
b[++m].use = n%Bsz; b[m-1].nxt = m;
for(int j = 1; j <= b[m].use; ++j)
b[m].a[j] = num[(m-1)*Bsz + j];
b[m].getmax();
}
char ch;
int x, y;
while(q--) {
while(!isalpha(ch=getc()));
ch=getc();
read(x), read(y);
switch(ch) {
case 'a':
printf("%d\n", Query1(x, y));
break; case 'i':
printf("%d\n", Query2(x, y));
break; case 'n':
Insert(x, y);
break; case 'e':
Merge(x, y);
break;
}
}
}

BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )的更多相关文章

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

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

  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]神秘物质

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

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

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

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

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

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

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

  9. 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题

    2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...

随机推荐

  1. [转帖]nginx location配置详细解释

    nginx location配置详细解释 http://outofmemory.cn/code-snippet/742/nginx-location-configuration-xiangxi-exp ...

  2. K8S从入门到放弃系列-(2)集群根证书准备

    k8s从1.8版本开始,集群中各个组件需要使用TLS证书对通信进行加密,每个k8s集群都需要有独立的CA证书体系,这里我们采用比较常用的CloudFlare 的 PKI 工具集 cfssl 来生成 C ...

  3. linux awk和sed工具

    慕课网链接:https://www.imooc.com/video/14508 部分示例命令 #替换passwd中的用户名和userid和gid gsed 's/\(^[a-z_-]\+\):\*:\ ...

  4. Centos7.3安装sonarqube

    安装使用sonarqube         前置依赖         mysql 5.6 or 5.7         jdk 1.8         1.下载             https:/ ...

  5. spring整合quartz框架

    spring整合quartz: 网上也有很多教程,好多都是基于配置方式,我们使用当然怎么简单就怎么用,所以这里介绍基于注解方式整合quartz.前提:你需要有一个能运行的web项目. 1.引依赖: & ...

  6. ASM实例修改SYS密码

    修改ASM实例中SYS用户密码 How To Change ASM SYS PASSWORD ? (文档 ID 452076.1) Oracle Database - Enterprise Editi ...

  7. 体验三大JavaScript文件上传库(Uppy.js/Filepond/Dropzone)

    最近发现了一个高颜值的前端上传组件Uppy.js,立即上手体验了一波,感觉还不错.然后又看到同类型的Filepond以及Dropzone.js,对比体验了一下,感觉都很优秀,但是在体验过程中,都遇到了 ...

  8. NHiberante从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑

    在.net framework中的创建session代码先贴一个 public class SessionBuilder { private static ISessionFactory _sessi ...

  9. Bat 批处理启动和停止Oracle 服务

    实际情况 * 不想开机自启动oracle服务,因为Windows 没有固态硬盘本身启动就很慢了,然后也不想自己手动的方式去启东oracle 服务 解决方案 *1启动 ``` @echo off ech ...

  10. Django rest-framework框架-组件之视图

    视图: a. django class Test(View): ... b. rest_framework class Test(APIView): ... c. GenericAPIView 一般不 ...