【bzoj4864】[BeiJing 2017 Wc]神秘物质 Splay
原文地址:http://www.cnblogs.com/GXZlegend/p/6801631.html
题目描述
输入
输出
样例输入
4 3
5 8 10 2
max 1 3
min 1 3
max 2 4
样例输出
5
2
8
题解
Splay
支持插入删除修改查询操作的数据结构当然是Splay
而且有:极差最大值必为整个区间的极差,极差最小值必为区间内两个相邻数的差的绝对值。
所以Splay应维护:子树最大值、子树最小值、子树最小极差。
前两个操作很水,最后一个操作还需要用到左子树中最后一个数、右子树中第一个数,一起维护一下就好了。
1A~ 很开心~
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200010
using namespace std;
int fa[N] , c[2][N] , si[N] , w[N] , maxn[N] , minn[N] , dl[N] , dr[N] , ms[N] , root;
char str[10];
int abs(int x)
{return x > 0 ? x : -x;
}
void pushup(int x)
{si[x] = si[c[0][x]] + si[c[1][x]] + 1;dl[x] = c[0][x] ? dl[c[0][x]] : x;dr[x] = c[1][x] ? dr[c[1][x]] : x;maxn[x] = max(w[x] , max(maxn[c[0][x]] , maxn[c[1][x]]));minn[x] = min(w[x] , min(minn[c[0][x]] , minn[c[1][x]]));ms[x] = min(ms[c[0][x]] , ms[c[1][x]]);if(c[0][x]) ms[x] = min(ms[x] , abs(w[x] - w[dr[c[0][x]]]));if(c[1][x]) ms[x] = min(ms[x] , abs(w[x] - w[dl[c[1][x]]]));
}
void build(int l , int r , int f)
{if(l > r) return;int mid = (l + r) >> 1;build(l , mid - 1 , mid) , build(mid + 1 , r , mid);fa[mid] = f , c[mid > f][f] = mid;pushup(mid);
}
void rotate(int &k , int x)
{int y = fa[x] , z = fa[y] , l = (c[1][y] == x) , r = l ^ 1;if(y == k) k = x;else c[c[1][z] == y][z] = x;fa[x] = z , fa[y] = x , fa[c[r][x]] = y , c[l][y] = c[r][x] , c[r][x] = y;pushup(y) , pushup(x);
}
void splay(int &k , int x)
{while(x != k){int y = fa[x] , z = fa[y];if(y != k){if((c[0][z] == y) ^ (c[0][y] == x)) rotate(k , x);else rotate(k , y);}rotate(k , x);}
}
int find(int k , int x)
{if(x <= si[c[0][k]]) return find(c[0][k] , x);else if(x > si[c[0][k]] + 1) return find(c[1][k] , x - si[c[0][k]] - 1);else return k;
}
int split(int l , int r)
{int a = find(root , l - 1) , b = find(root , r + 1);splay(root , a) , splay(c[1][root] , b);return c[0][c[1][root]];
}
int main()
{int n , m , i , x , y , t , tot;scanf("%d%d" , &n , &m) , tot = n + 2;for(i = 2 ; i <= n + 1 ; i ++ ) scanf("%d" , &w[i]);maxn[0] = 0 , minn[0] = ms[0] = 0x3fffffff;build(1 , n + 2 , 0) , root = (n + 3) >> 1;while(m -- ){scanf("%s%d%d" , str , &x , &y);switch(str[1]){case 'e': t = split(x + 1 , x + 2) , c[0][t] = c[1][t] = 0 , w[t] = y , pushup(t) , pushup(c[1][root]) , pushup(root); break;case 'n': split(x + 2 , x + 1) , c[0][c[1][root]] = ++tot , w[tot] = y , fa[tot] = c[1][root] , pushup(tot) , pushup(c[1][root]) , pushup(root); break;case 'a': t = split(x + 1 , y + 1) , printf("%d\n" , maxn[t] - minn[t]); break;default: printf("%d\n" , ms[split(x + 1 , y + 1)]);}}return 0;
}
转载于:https://www.cnblogs.com/GXZlegend/p/6801631.html
【bzoj4864】[BeiJing 2017 Wc]神秘物质 Splay相关推荐
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- 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]神秘物质
(http://www.elijahqi.win/2018/01/26/bzoj4864-beijing-2017-wc%E7%A5%9E%E7%A7%98%E7%89%A9%E8%B4%A8/%20 ...
- bzoj 4864: [BeiJing 2017 Wc]神秘物质 splay
Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...
- BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap
题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始 ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[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 ...
- [BZOJ]4864: [BeiJing 2017 Wc]神秘物质
题解: 操作1 分解为删除一个元素和修改一个元素的权值 操作2:插入一个元素 操作3:查询区间里面子区间的极差最大值 等价于直接求区间最大值减去区间最小值 操作4:查询区间子区间里面极差最小值 ...
最新文章
- python安装教程windows-Python for windows 安装教程
- c++面向对象高级编程 学习二 带指针的类
- mysql 连接查询 子查询 备份 笔记
- 微软设计套装 Expression Studio 4 (Ultimate+Web Pro+Encoder Pro) 最新版下载
- 迭代反投影法代码_Ceres求解直接法BA实现自动求导
- vue指令02---自动获取焦点(全局自定义指令Vue.directive())和全局过滤器Vue.filter() 的学习...
- oracle silent 安装
- Kafka从上手到实践 - Kafka CLI:Reseting Offset Config CLI | 凌云时刻
- webstorm汉化之后出现乱码现象
- windows版本变迁
- win10 python安装以及编辑器pycharm安装
- Ubuntu下连接共享打印机的方法
- 产品经理必修课之互联网产品设计流程
- 微服务api网关_微服务设计api网关模式
- 私有CA搭建并将HTTPS应用于Tomcat、Springboot
- 90后首次购房心路历程
- python 战舰_419. 甲板上的战舰(Python)
- 有没有好人看看,谢谢谢谢
- 一款基于企业微信的固定资产管理软件
- Mac系统自带中文输入法英文标点
热门文章
- python-笔记(四)函数
- 没有windows安装光盘怎么修复计算机,电脑没有u盘光盘重装windows7系统的方法步骤教程 - 系统家园...
- HTTPSQS 1.7 版本更新内容
- vmware走主机代理
- Zabbix监控屏幕全屏显示多个监控项
- proteus元件图片_proteus元件对照表(经典详细)
- 十位世界级顶尖投资大师的投资哲学:忍耐、聚焦、坚定
- js使用rgb和argb
- 论文项目复现笔记----Emotion Driven Monocular Face Capture and Animation
- javase_test_day13