[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最近被公司升任为营业部经理,他上 ...
随机推荐
- 【Spring实战】----开篇(包含系列目录链接)
[Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...
- mcrouter facebook 开源的企业级memcached代理
原文地址:https://code.facebook.com/posts/296442737213493/introducing-mcrouter-a-memcached-protocol-route ...
- 牛客网暑期ACM多校训练营(第七场):J-Sudoku Subrectangles
链接:J-Sudoku Subrectangles 题意:给出 n * m 的字母矩阵,公52种字母.求出不含重复元素的子矩阵的个数. 题解: L[i][j]:s[i][j] ~ s[i][ j - ...
- Python之tornado框架实现翻页功能
1.结果如图所示,这里将html页面与网站的请求处理放在不同地方了 start.py代码 import tornado.ioloop import tornado.web from controlle ...
- PHP整数取余返回负数解决办法
<?php $num1 = 1494313163777; $num2 = 9999; //直接计算取余会出错,出现负数 -8779 //echo $num1 % $num2;exit; //算上 ...
- 使用PHP静态变量当缓存的方法
下面这个PHP的代码实例,功能是帮助用户重置密码,requestResetPassword是接收用户重置密码的请求并且做了相应的检查.为了更好的复用性,我将重置密码的操作单独分配到一个新的resetP ...
- Struts1之logic标签
logic是Struts1中的逻辑标签 <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-l ...
- 使用JSON数据格式模拟股票实时信息
JQueryStock.html <!DOCTYPE html> <head> <meta charset="UTF-8"> <title ...
- Mapreduce简要原理与实践
探索Mapreduce简要原理与实践 目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapred ...
- BZOJ4592 SHOI2015脑洞治疗仪(线段树)
考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k ...