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—营业额统计的更多相关文章

  1. BZOJ1588: [HNOI2002]营业额统计[BST]

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Sta ...

  2. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  3. bzoj1588 [HNOI2002]营业额统计(Treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 11485  Solved: 4062[Submit][Sta ...

  4. 【链表】BZOJ1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 17555  Solved: 7179[Submit][Sta ...

  5. [BZOJ1588][HNOI2002]营业额统计 无旋Treap

    [HNOI2002]营业额统计 时间限制: 5 Sec  内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...

  6. BZOJ1588 [HNOI2002]营业额统计 splay模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][S ...

  7. bzoj1588: [HNOI2002]营业额统计(权值线段树)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 16863  Solved: 6789[Submit][Sta ...

  8. bzoj1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...

  9. [BZOJ1588] [HNOI2002] 营业额统计 (treap)

    Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...

  10. BZOJ1588 [HNOI2002]营业额统计 set

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求  ∑F[i],其中F[1] = a[1] , F[i] = min( ...

随机推荐

  1. [java]java语言初探 servlet+jsp架构

    <<head first java>> https://www.tutorialspoint.com/jsp/jsp_architecture.htm JSP Processi ...

  2. Framework/base 下添加自定义模块的步骤

    在Android源码编译成功的基础上,重新编译带自己API的android.jar需要进行以下几个步骤操作:1.添加自己的源代码,在android源码的frameworks/base目录下新建一个文件 ...

  3. 精通jQuery选择器

    虽然jQuery上手简单,相比于其他库学习起来较为简单,但是要全面掌握,却不轻松.因为它涉及到网页开发的方方面面,提供的方法和内部变化有上千种之多.初学者常常感到,入门很方便,提高很困难.本文的目标是 ...

  4. Qt学习笔记 ListWidget的增删改

    学习了一下ListWidget控件的使用,做一个小功能增删改 先把代码分解最后给出完整代码 在窗体上添加一个ListWidget 一个Horizontal Specer和  三个PushButton ...

  5. DOM与元素节点内联样式

    获取.设置及移除单个内联 CSS 属性 每个 HTML 元素都有个 style 属性,可以用来插入针对该元素的内联 CSS 属性. <div style='background-color:bl ...

  6. 汤姆大叔的6道javascript编程题题解

    看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4 ...

  7. 使用rest方式修改服务端xml文件

    想法: 最近想用REST的方式去修改一个远端的xml文件,于是自己写了个Handler 设计: 用现成的XPath,和GET,POST,PUT,DELETE这4个http方法作为动作,达到直接读写xm ...

  8. Windows Phone 8 显示当前项目的使用内存,最大峰值,最大内存上限

    public static class MemoryDiagnosticsHelper { public static bool isStart = false; static Popup popup ...

  9. 开发WP版本的大菠萝英雄榜

    前言 想当年Team有无数人在玩大菠萝,我被忽悠进来做肉盾,选了蛮子,从1.0开始,经历了103.105.108.2.0.2.1.这个游戏对我最大的帮助是学习了不同的技术,比如XAML.比如xcode ...

  10. [BZOJ2257][Jsoi2009]瓶子和燃料(数学)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2257 分析: 1.先考虑确定的瓶子下的最小体积是多少 ①假设只有两个瓶子v1,v2,易 ...