[bzoj1588][HNOI2002]营业额统计——splay
题目大意
你被要求编写一个数据结构,支援以下操作,操作在线。
- 插入一个元素
- 查询一个元素与之前插入元素的最小差值。
题解
一道模板题。我是写了一个pre和succ函数水过的。1A,比较高兴。
代码
#include <algorithm>
#include <cstdio>
const int maxn = 40000;
int ch[maxn][2], fa[maxn], data[maxn], cnt[maxn], rt, sz, size[maxn];
void update(int k) { size[k] = size[ch[k][0]] + size[ch[k][1]] + cnt[k]; }
void zig(int x) {
int y = fa[x], z = fa[y], l = (ch[y][1] == x), r = l ^ 1;
fa[ch[y][l] = ch[x][r]] = y;
fa[ch[x][r] = y] = x;
fa[x] = z;
if (z)
ch[z][ch[z][1] == y] = x;
update(y);
}
void splay(int x, int aim = 0) {
for (int y; (y = fa[x]) != aim; zig(x))
if (fa[y] != aim)
zig((ch[y][0] == x) == (ch[fa[y]][0] == x) ? y : x);
if (aim == 0)
rt = x;
update(x);
}
void insert(int v) {
int x = rt;
if (rt == 0) {
rt = x = ++sz;
data[x] = v;
size[x] = cnt[x] = 1;
fa[x] = ch[x][0] = ch[x][1] = 0;
return;
}
while (x) {
size[x]++;
if (v == data[x]) {
cnt[x]++;
return;
}
int &y = ch[x][v >= data[x]];
if (y == 0) {
y = ++sz;
data[y] = v;
size[y] = cnt[y] = 1;
fa[y] = x;
ch[y][0] = ch[y][1] = 0;
x = y;
break;
}
x = y;
}
splay(x);
}
int pre(int v) {
int ans = -1;
for (int y = rt; y;) {
if (data[y] <= v)
ans = data[y], y = ch[y][1];
else
y = ch[y][0];
}
return ans;
}
int succ(int v) {
int ans = -1;
for (int y = rt; y;) {
if (data[y] >= v)
ans = data[y], y = ch[y][0];
else
y = ch[y][1];
}
return ans;
}
int main() {
#ifdef D
freopen("input", "r", stdin);
#endif
int ans = 0;
int n, x;
rt = 0;
scanf("%d %d", &n, &x);
insert(x);
ans += x;
for (int i = 2; i <= n; i++) {
scanf("%d", &x);
int ret = 0x3f3f3f;
int y = pre(x);
if (y != -1)
ret = std::min(ret, abs(x - y));
y = succ(x);
if (y != -1)
ret = std::min(ret, abs(x - y));
if (ret != 0x3f3f3f)
ans += ret;
insert(x);
}
printf("%d\n", ans);
return 0;
}
[bzoj1588][HNOI2002]营业额统计——splay的更多相关文章
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- bzoj1588: [HNOI2002]营业额统计 splay瞎写
最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉 ...
- BZOJ1588: [HNOI2002]营业额统计[BST]
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14151 Solved: 5366[Submit][Sta ...
- 【BZOJ-1588】营业额统计 Splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12485 Solved: 4508[Submit][Sta ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- [HNOI2002]营业额统计 Splay tree入门题
题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec ...
- Bzoj 1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
随机推荐
- Scala学习笔记(二):运行脚本文件
在某个目录(如:F:\)下新建一个文本文件,命名为:hello.scala 其内容为: println("Hello World!") 那么这个时候该怎么运行这个脚本文件呢? 通过 ...
- OpenCV入门:(三:图片Mask operations)
Mask operations 翻译为中文应该是掩模操作,具体操作步骤就是根据一个操作矩阵(又名kernel)处理图片中的每一个像素点,操作矩阵会根据当前像素点的周围像素来调整当前像素值. 1.示例 ...
- java---解析XML文件,通过反射动态将XML内容封装到一个类中
本博客讲的XML解析,使用的是dom4j. 首先建立一个maven项目,在dom.xml中引入相应的dom4j的版本.作者下载的是热度很高的1.6.1版本.maven的使用在这里不做详细讲解. 引入成 ...
- 把python脚本打包成win可执行文件
前几天有个朋友找我写一点小东西,写好后把代码发他帮他搞了半天,结果愣是没听懂,就找到了这个办法. 1.导入pyinstaller包, pip install pyinstaller 2.进入到你需要打 ...
- 梳理 Opengl ES 3.0 (三)顶点坐标变换
先来个宏观上的理解: 其实这块逻辑是个标准流程,而且其他地方介绍的也很多了,这里简单提下. 坐标转换,其实是不同坐标系之间的变换,一个渲染顶点,要想让它呈现在屏幕上的某个位置,是需要让这个顶点经过一个 ...
- [POJ3585]Accumulation Degree
题面 \(\text{Solution:}\) 有些题目不仅让我们做树型 \(\text{dp}\) ,而且还让我们换每个根分别做一次, 然后这样就愉快的 \(\text{TLE}\) 了,所以我们要 ...
- 机器学习性能指标精确率、召回率、F1值、ROC、PRC与AUC--周振洋
机器学习性能指标精确率.召回率.F1值.ROC.PRC与AUC 精确率.召回率.F1.AUC和ROC曲线都是评价模型好坏的指标,那么它们之间有什么不同,又有什么联系呢.下面让我们分别来看一下这几个指标 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- sqlserver2012 查询远程数据库
EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','121.43.177.236'EXEC sp_addlinkedsrvlogin 'LinkName ...
- python中locals和globals函数
参考:http://www.cnblogs.com/wanxsb/archive/2013/05/07/3064783.html Python有两个内置的函数,locals() 和globals(), ...