4864: [BeiJing 2017 Wc]神秘物质

Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 92 Solved: 50
[Submit][Status][Discuss]
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 类事件的测量结果。
Sample Input

4 3

5 8 10 2

max 1 3

min 1 3

max 2 4

Sample Output

5 2 8
HINT

Source

[Submit][Status][Discuss]


考虑一段连续区间,最大极差子区间的取法一定可以取这整个区间
因为此时最大值最大最小值最小,不可能存在极差更大的了
而最小极差子区间的取法一定是连续的两个位置
因为若扩展区间,只会让最大值趋于更大最小值趋于更小,显然不优
那么两种修改操作随便用splaysplay维护就好了
每个节点维护区间极值以及相邻位置的差的极值就行了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 2E5 + 20;
const int INF = ~0U>>1;int n,m,cnt,rt,fa[maxn],key[maxn],Max[maxn],Min[maxn],siz[maxn],dt[maxn],ch[maxn][2],Left[maxn],Right[maxn];
char s[10];#define abs(x) ((x) >= 0 ? (x) : -(x))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))inline int getint()
{char ch = getchar(); int ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret * 10 + ch - '0',ch = getchar();return ret;
}inline int getcom()
{scanf("%s",s);if (s[1] == 'e') return 1;if (s[1] == 'n') return 2;if (s[1] == 'a') return 3;return 4;
}inline void maintain(int x)
{siz[x] = 1; dt[x] = INF;Max[x] = Min[x] = Left[x] = Right[x] = key[x];if (ch[x][0]){siz[x] += siz[ch[x][0]];Left[x] = Left[ch[x][0]];dt[x] = min(dt[x],dt[ch[x][0]]);Min[x] = min(Min[x],Min[ch[x][0]]);Max[x] = max(Max[x],Max[ch[x][0]]);dt[x] = min(dt[x],abs(Right[ch[x][0]] - key[x]));}if (ch[x][1]){siz[x] += siz[ch[x][1]];Right[x] = Right[ch[x][1]];dt[x] = min(dt[x],dt[ch[x][1]]);Min[x] = min(Min[x],Min[ch[x][1]]);Max[x] = max(Max[x],Max[ch[x][1]]);dt[x] = min(dt[x],abs(Left[ch[x][1]] - key[x]));}
}inline void rotate(int x)
{int y = fa[x],z = fa[y];int d = ch[y][0] == x ? 0 : 1;ch[y][d] = ch[x][d^1]; fa[ch[x][d^1]] = y;ch[x][d^1] = y; fa[y] = x; maintain(y); maintain(x);fa[x] = z; if (z) ch[z][ch[z][1] == y] = x,maintain(z);
}inline void splay(int x)
{for (int y = fa[x]; y; rotate(x),y = fa[x])if (fa[y]) rotate((ch[y][0] == x) ^ (ch[fa[y]][0] == y) ? x : y);
}inline int Find(int x,int k)
{int now = siz[ch[x][0]] + 1;if (now == k) return x;if (now > k) return Find(ch[x][0],k);return Find(ch[x][1],k - now);
}inline int Build(int l,int r)
{if (l > r) return 0;int mid = l + r >> 1;ch[mid][0] = Build(l,mid - 1);ch[mid][1] = Build(mid + 1,r);if (ch[mid][0]) fa[ch[mid][0]] = mid;if (ch[mid][1]) fa[ch[mid][1]] = mid;maintain(mid); return mid;
}inline void Merge(int x,int e)
{int A,B = Find(rt,x + 1),C;splay(B); A = Find(ch[B][0],x);C = ch[B][1]; fa[ch[B][0]] = 0;splay(A); ch[A][1] = C; if (C) fa[C] = A;key[A] = e; maintain(A); rt = A;
}inline void Insert(int x,int e)
{int A = Find(rt,x),B;splay(A); B = ch[A][1];key[++cnt] = e; maintain(cnt);ch[A][1] = cnt; fa[cnt] = A; maintain(A);splay(rt = cnt); ch[rt][1] = B;if (B) fa[B] = rt; maintain(rt);
}inline void Query(int x,int y,int typ)
{int A,B,C = Find(rt,y),D;splay(C); D = ch[C][1];ch[C][1] = 0; maintain(C);B = Find(C,x); splay(B);A = ch[B][0]; ch[B][0] = 0; maintain(B);printf("%d\n",typ == 1 ? Max[B] - Min[B] : dt[B]);ch[B][0] = A; maintain(B); splay(C);ch[C][1] = D; maintain(C); rt = C;
}int main()
{#ifdef DMCfreopen("DMC.txt","r",stdin);freopen("test.txt","w",stdout);#endifcnt = n = getint(); m = getint();for (int i = 1; i <= n; i++) key[i] = getint();rt = Build(1,n);while (m--){int typ = getcom(),x,y;x = getint(); y = getint();if (typ == 1) Merge(x,y);else if (typ == 2) Insert(x,y);else if (typ == 3) Query(x,y,1);else Query(x,y,0);}return 0;
}

4864: [BeiJing 2017 Wc]神秘物质相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 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 ...

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

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

最新文章

  1. 中国互联网+果汁行业商业模式创新与投资机会深度研究报告
  2. 科学家认为“人脑+AI”至少有三大尺度:最低级是脑启发,最高级是创造机器意识...
  3. html5,表格与框架综合布局
  4. ACL初识(访问控制列表)
  5. 没有可用软件包 jenkins。_Jenkins分布式构建与并行构建
  6. 微电子科学与工程要学计算机吗,微电子科学与工程专业就业前景如何 有前途吗...
  7. 使用protostuff进行序列化
  8. 信息学奥赛C++语言:趣味整数2(亲密数)
  9. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例
  10. Linux 与 Windows 计算文件夹大小
  11. 流水灯程序 keil_天问51学习笔记(3):8个任务的uCOS II程序框架
  12. 【FPGA】基于bt1120时序设计实现棋盘格横纵向灰阶图数据输出
  13. 2022美赛C题 F奖思路分享
  14. python下载安装教程
  15. 教你电脑系统如何深度清理c盘空间
  16. JAVA初学,小白编程,8大基本类型
  17. bitlocker正在加密 c盘_新电脑安装操作系统一定要注意硬盘是否被bitlocker加密!...
  18. Ubuntu上实现多分屏窗口管理
  19. linux lsof命令和ps的,Linux 中lsof 命令的使用
  20. “家贼”倒卖“征途”源代码 13万元卖给识货人

热门文章

  1. Java项目:游戏点评系统(java+SSM+JSP+JavaScript+mysql)
  2. jasper翻译_Jasper为什么成为了Max的小翻译 孩子要从小学习双语吗
  3. 为论文添加目录的方法
  4. AI遮天传 DL-深度学习在计算机视觉中的应用
  5. flash特效原理:图片切换滚动
  6. 6.1. Inserting Data
  7. 朴素贝叶斯法 - 垃圾邮件分类
  8. 使用Hexo构架个人网站
  9. 使用VBA如何将中文字符转换为区位码
  10. php中可以表示当前日期的函数,在PHP中,可以使用()函数来获取当前日期和时间...