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. 5 个最好的3D游戏开发工具(转)

    转自:http://www.open-open.com/news/view/33a4f0 5 个最好的3D游戏开发工具 jopen 2012-11-19 22:56:21 • 发布 摘要:UDK(th ...

  2. 动画制作库tween样例学习

    mark: https://www.npmjs.com/package/tween

  3. 004商城项目:ssm框架的整合之后的调试

    我们来做一个测试应用,去数据库中输入item表的id然后找到里面的信息转换成json显示在页面上. item表如下: 效果: 代码如下: Dao层: 逆向工程自己的的Mapper. Service层: ...

  4. C#获取文件MD5字符串

    备注 哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串.加密哈希函数有这样一个属性:在计算不大可能找到散列为相同的值的两个不同的输入:也就是说,两组数据的哈希值仅在对应的数据也匹配时才 ...

  5. pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

    pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat Windows7下pip安装包报错:Microso ...

  6. Alpha版本测试报告

    请根据团队项目中软件的需求文档.功能规格说明书和技术规格说明书,写出软件的测试计划.测试过程和测试结果,并回答下述问题. 1. 在测试过程中发现了多少Bug? 2. 你是怎么进行场景测试(scenar ...

  7. PHP 基础笔记

    数据类型 字符串 整数 浮点数 布尔值 数组 对象 NULL 未定义的变量,数据类型为 NULL. PHP 中数组和对象是不同的类型,而 js 中数组即为对象.(ps: es6 已经内置了 class ...

  8. WPF 3D模型 3D场景

    1.首先得说明的是这并不是真正的3D,模型被导出为一系列的单个图片,例如一个3D户型图,以某个视角旋转360°,渲染出一系列连续的单个图片文件. 2.在Image.MouseMove事件中添加相应代码 ...

  9. Java:注解(元数据)

    初识Java注解 所谓的元数据是指用来描述数据的数据,可能刚听到元数据的时候你会有点陌生,其实任何一个使用过struts或者hibernate的开发人员都在不知不觉中使用元数据,更通俗一点来说元数据是 ...

  10. Bootstrap系列 -- 7. 列表排版方式

    一. 去点列表 1. 使用class=list-unstyled <ul > <li>无序列表项目</li> <li>无序列表项目</li> ...