【bzoj1588】 HNOI2002—营业额统计
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 (题目链接)
题意
给出一个序列,对于每一个数,找出之前与它相差最小的数,两者相减取绝对值加入答案。
Solution1
这道题只有单点插入和查询前驱后继的操作,其实完全可以set水过去,算了就当splay练手吧。。
这道题要求splay满足二叉搜索树的性质,而对序列的顺序没有要求,于是我们每次在平衡树中插入一个节点,然后splay到根节点,因为平衡树满足二叉搜索树的性质,这样的话查询前驱和后继的时候就可以大大减少复杂度。
代码
// bzoj1588
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int fa[maxn],tr[maxn][2],val[maxn];
int n,size,rt,t1,t2; void rotate(int x,int &k) {
int y=fa[x],z=fa[y],l,r;
if (tr[y][0]==x) l=0;else l=1;r=l^1;
if (k==y) k=x;
else tr[z][tr[z][1]==y]=x;
fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
tr[y][l]=tr[x][r];tr[x][r]=y;
}
void splay(int x,int &k) {
while (x!=k) {
int y=fa[x],z=fa[y];
if (y!=k) {
if (tr[y][0]==x ^ tr[z][0]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
bool insert(int &k,int x,int f) {
if (k==0) {k=++size;val[k]=x,fa[k]=f,splay(k,rt);return 1;}
if (val[k]==x) return 0;
if (x<val[k]) return insert(tr[k][0],x,k);
else return insert(tr[k][1],x,k);
}
void query_pr(int k) {
if (tr[k][0]==0) return;
k=tr[k][0];
while (tr[k][1]) k=tr[k][1];
t1=val[k];
}
void query_nx(int k) {
if (tr[k][1]==0) return;
k=tr[k][1];
while (tr[k][0]) k=tr[k][0];
t2=val[k];
}
int main() {
scanf("%d",&n);
int ans=0;
for (int x,i=1;i<=n;i++) {
scanf("%d",&x);
if (!insert(rt,x,0)) continue;
t1=-inf;t2=inf;
query_pr(rt);
query_nx(rt);
if (i==1) ans+=x;
else ans+=min(x-t1,t2-x);
}
printf("%d",ans);
return 0;
}
UPD:
solution2
双向链表,来自2016NOIP初赛补全代码T1的思路。。。完爆splay啊。。
细节
快排的cmp函数的<改成<=就迷之RE。。
代码
// bzoj1588
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int nxt[maxn],pre[maxn],a[maxn],rank[maxn];
int n; int cmp(int x,int y) {
return a[x]<a[y];
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
rank[i]=i;
}
sort(rank+1,rank+1+n,cmp);
for (int i=1;i<=n;i++) {
pre[rank[i]]=rank[i-1];
nxt[rank[i]]=rank[i+1];
}
int ans=0;
for (int i=n;i>=2;i--) {
int l=inf,r=inf;
if (pre[i]!=0) l=a[i]-a[pre[i]];
if (nxt[i]!=0) r=a[nxt[i]]-a[i];
ans+=min(l,r);
nxt[pre[i]]=nxt[i];
pre[nxt[i]]=pre[i];
}
printf("%d",ans+a[1]);
return 0;
}
【bzoj1588】 HNOI2002—营业额统计的更多相关文章
- BZOJ1588: [HNOI2002]营业额统计[BST]
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14151 Solved: 5366[Submit][Sta ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17555 Solved: 7179[Submit][Sta ...
- [BZOJ1588][HNOI2002]营业额统计 无旋Treap
[HNOI2002]营业额统计 时间限制: 5 Sec 内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- bzoj1588: [HNOI2002]营业额统计(权值线段树)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 16863 Solved: 6789[Submit][Sta ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- [BZOJ1588] [HNOI2002] 营业额统计 (treap)
Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- BZOJ1588 [HNOI2002]营业额统计 set
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求 ∑F[i],其中F[1] = a[1] , F[i] = min( ...
随机推荐
- ESXi 5.5 解决 cannot edit the settings of virtual machines of version 10
ESXi 5.5 是VMWare提供的免费虚拟服务器软件, 因为其优秀的性能, 对CPU, 内存和虚拟机数量都解除了限制, 成为很多个人或者小型公司的首选虚拟化工具. 在日常管理时常碰到的一个问题是, ...
- jquery 添加节点的几种方法介绍
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 监听grid行点击事件
- 002商城项目:maven工程的测试以及svn的使用
我们上一篇文章搭建了maven工程,这一篇文章我们就要测试这个工程. 1: 由于这个工程还没有页面,我们要首先建立一个页面.在建立页面的jsp的过程中,我发现了一个问题,我这个eclipse由于缺少J ...
- CodeDom
细说CodeDom 在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说, ...
- NOI2018准备 Day8
清北学堂入学测试,6道题凑了363分,平均466才能达到省选班的程度,差距不小. 今天突然感觉最大的BOSS是搜索,虽然每次都写崩...... 3个小时写了一道DP没写出来 但我不会忘记,我的首个目标 ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- 前端备忘录 — IE 的条件注释
CSS hack 由于不同厂商的浏览器,比如 Internet Explorer,Safari,Mozilla Firefox, Chrome 等,或者是同一厂商的浏览器的不同版本,如 IE6 和 I ...
- 高性能JavaScript DOM编程
我们知道,DOM是用于操作XML和HTML文档的应用程序接口,用脚本进行DOM操作的代价很昂贵.有个贴切的比喻,把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用 ...
- gocode+auto-complete搭建emacs的go语言自动补全功能
上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...