bzoj 1588营业额统计(HNOI 2002)
http://www.lydsy.com/JudgeOnline/problem.php?id=1588
splay bottom-up的数组实现。
题意就是给你一组数,求每个数与在其前面且与其最相近的数的差值的绝对值。
考虑splay二叉搜索树的特性,每新插入一个节点,比它小且最靠近它的数在是左子树中的最大值,另一半同理。
代码借鉴自:http://blog.csdn.net/ACM_cxlove?viewmode=contents
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + ;
const int inf = 0x3f3f3f3f;
int pre[maxn], key[maxn], ch[maxn][], root, size;
int n; void new_node(int &r, int father, int k){
r = ++size;
pre[r] = father;
key[r]= k;
ch[r][] = ch[r][] = ;
} void rotate(int x, bool d){// d = 1, right rotate
int y = pre[x];
ch[y][!d] = ch[x][d];
pre[ch[x][d]] = y;
if(pre[y]) ch[pre[y]][ch[pre[y]][] == y] = x;
//if y is not the root, link x with its grandparent
pre[x] = pre[y];
ch[x][d] = y;
pre[y] = x;
} void splay(int u, int dest){
//root u to root dest
while(pre[u] != dest){
if(pre[pre[u]] == dest) rotate(u, ch[pre[u]][] == u);
else{
int y = pre[u];
int d = ch[pre[y]][] == y;
if(ch[y][d] == u){//zig-zag
rotate(u, !d);
rotate(u, d);
}else{
rotate(y, d);//zig-zig
rotate(u, d);
}
}
}
if(!dest) root = u;
} int insert(int k){
int u = root;
while(ch[u][key[u] < k]){
if(key[u] == k) return splay(u, ), ;
u = ch[u][key[u] < k];
}
if(key[u] == k) return splay(u, ), ;
new_node(ch[u][key[u] < k], u, k);
splay(ch[u][key[u] < k], );
return ;
} int get_pre(int x){
int tem = ch[x][];
if(!tem) return inf;
while(ch[tem][]) tem = ch[tem][];
return key[x] - key[tem];
} int get_next(int x){
int tem = ch[x][];
if(tem == ) return inf;
while(ch[tem][]) tem = ch[tem][];
return key[tem] - key[x];
} int main(){
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n)){
root = size = ;
int ans = ;
for(int i = ; i <= n; i++){
int num;
if(scanf("%d", &num) == EOF) num = ;
if(i == ){
ans += num;
new_node(root, , num);
continue;
}
if(!insert(num)) continue;
int a = get_next(root);
int b = get_pre(root);
ans += min(a, b);
}
printf("%d\n", ans);
}
return ;
}
bzoj 1588营业额统计(HNOI 2002)的更多相关文章
- BZOJ 1588 营业额统计
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588 营业额统计 set
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1588 题目大意: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交 ...
- (HYSBZ)BZOJ 1588 营业额统计
营业额统计 Time Limit: 5000MS Memory Limit: 165888KB 64bit IO Format: %lld & %llu Description 营业额 ...
- BZOJ 1588 营业额统计 Splay
主要操作为Splay中插入节点,查找前驱和后继节点. 1: #include <cstdio> 2: #include <iostream> 3: #include <c ...
- [bzoj] 1588 营业额统计 || Splay板子题
原题 给出一个n个数的数列ai ,对于第i个元素ai定义\(fi=min(|ai-aj|) (1<=j<i)\),f1=a1,求\(/sumfi\) Splay板子题. Splay讲解:h ...
- HYSBZ - 1588 营业额统计 (伸展树)
题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...
- HYSBZ 1588 营业额统计
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:详见题面,中文 思路:平衡树的模板题. 可用Treap,Splay,Scape ...
- HYSBZ 1588 营业额统计 (Splay树)
题意:给出一个公司每一天的营业额,求每天的最小波动值之和.该天的最小波动值= min { 绝对值| 该天以前某一天的营业额-该天的营业额 | }.第一天的最小波动值就是其自己. 思路:Splay伸展树 ...
- [BZOJ 1588][HNOI 2002] 营业额统计
这果然是在那个没有STL的年代出的题 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 16648 Solve ...
随机推荐
- Swift实战-小QQ(第1章):QQ登录界面
1.新建小QQ项目 2.将所需用到的图片资源(resource)文件夹,添加到项目中.并新建一个登录页面:LoginViewController.swift 3.修改LoginViewControll ...
- __int64和long long输入输出
__int64 num; scanf("%I64d", &num); printf("%I64d\n", num); long long num; sc ...
- Java基础(4):Scanner输入的典型应用
import java.util.Scanner; /* * 功能:为指定的成绩加分,直到分数大于等于60为止 * 输出加分前的成绩和加分后的成绩,并且统计加分的次数 * 步骤: * 1.定义一个变量 ...
- Spring 中的 Bean 配置
内容提要 •IOC & DI 概述 •配置 bean –配置形式:基于 XML 文件的方式:基于注解的方式 –Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & ...
- 当执行php脚本时用户关闭浏览器会发生什么?
2008年8月16日 1,152 views 发表评论 阅读评论 如果一段php脚本执行插入数据到mysql的操作. 一般情况下,由于php脚本在服务器上执行,此时用户虽然关闭了浏览器,但是服务器端的 ...
- sql set xact_abort on 用例
set xact_abort on 设置事务回滚的当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚为OFF时,只回滚错误的地方 例子 : ALTER proc [dbo].[BuC ...
- 远程mysql服务器无法连接解决方案
错误现象:Habon被拒绝. 远程服务器无法连接从两个方面看 1.是否能ping通远程服务器 windows下查看防火墙是否已关闭 linux下查看iptables等 2.数据库是否有开用户管理权限 ...
- C动态内存分配
全局变量:静态存储区 非静态局部变量(包括形参):动态存储区------>栈(stack) 建立内存动态分配区域,存放临时数据---------->堆(heap)由于未在声明部分定义他们为 ...
- 向已写好的多行插入sql语句中添加字段和值
#region 添加支款方式--向已写好的多行插入sql语句中添加字段和值 public int A_ZhifuFS(int diqu) { ; string strData = @"SEL ...
- 收缩TempDB的办法(转载)
有时候在数据库上运行一个数据量很大的查询语句,会导致TempDB数据量剧增,具体查看下面链接文章: SqlServer 一个查询语句导致tempdb增大55G 找到TempDB剧增的问题后,接下来的问 ...