【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1588

【题目大意】

  给出一个数列,对于每个数,选择其前面的某个数作差取绝对值,
  使得所有差的绝对值的和最小,第一个数统计其值作为该数的答案。

【题解】

  题目等价于在一个数前面寻找最接近的一个数,
  显然这是一个平衡树求前继和后继能解决的为问题,
  然而因为题目可以离线,我们考虑编码复杂度更低的基础数据结构,
  我们将所有数据排序,构造双向链表,那么单节点左右就是与其差值最小的数,
  我们按数列逆序处理节点,当计算完一个节点之后将其从链表中删除即可。
  由于链表的有序性,使得剩余节点始终满足左右节点为当前剩余点中与该节点差值最小的点,
  复杂度O(nlogn).

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=500000;
struct data{int l,r,num,id;}p[N];
bool cmp(data a,data b){return a.num<b.num;}
int n,pos[N];
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++)scanf("%d",&p[i].num),p[i].id=i;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
p[i].l=i-1,p[i].r=i+1;
pos[p[i].id]=i;
}p[n].r=0;
long long ans=p[pos[1]].num;
for(int i=n;i>1;i--){
int x=pos[i];
if(p[x].l&&p[x].r){
ans+=min(p[p[x].r].num-p[x].num,p[x].num-p[p[x].l].num);
p[p[x].l].r=p[x].r;
p[p[x].r].l=p[x].l;
}else if(p[x].l){
ans+=p[x].num-p[p[x].l].num;
p[p[x].l].r=0;
}else{
ans+=p[p[x].r].num-p[x].num;
p[p[x].r].l=0;
}
}printf("%lld\n",ans);
}return 0;
}

BZOJ 1588 [HNOI2002]营业额统计(双向链表)的更多相关文章

  1. BZOJ 1588: [HNOI2002]营业额统计 双向链表

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  2. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  3. BZOJ 1588: [HNOI2002]营业额统计

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

  4. bzoj 1588: [HNOI2002]营业额统计 treap

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

  5. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

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

  6. 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  7. Bzoj 1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  8. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

  9. bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

    来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大 ...

随机推荐

  1. 火狐浏览器下点击a标签时出现虚线的解决方案

    1.兼容性问题 火狐浏览器下点击a标签时出现虚线 2.解决方案 a:focus { outline: none;}

  2. selenium WebElement 的属性和方法 属性

    tag_name 标签名,例如 'a'表示<a>元素get_attribute(name) 该元素name 属性的值text 该元素内的文本,例如<span>hello< ...

  3. C高级 跨平台协程库

    1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别 ...

  4. [How to] 真机调试

    1.简介 真机调试介绍. 在xcode7之前需要每年99刀的代价才能活着开发者权限并能够在真机上调试,现在如果单纯的想在真机上调是就不必花这个钱了. 2.步骤 完毕.

  5. [How to] 使用Xib来创建view

    1.简介 代码库 正如之前博客介绍的,xib可定义页面的某个部分,特别当此部分区域的view集中并且还有一些相互关联性(如隐藏等)是i特别适合使用xib来进行封装. 本文为[How to]使用自定义c ...

  6. service XXX start启动报start: Rejected send message, 1 matche

    转,原文地址:http://blog.sina.com.cn/s/blog_56d8ea9001018w1l.html [问题]start: Rejected send messag现象:crifan ...

  7. ES6 promise简单实现

    基本功能实现: function Promise(fn){ //需要一个成功时的回调 var doneCallback; //一个实例的方法,用来注册异步事件 this.then = function ...

  8. Struts2学习笔记03 之 Result组件

    二.Result原理 1.stream 2.redirectAction 3.Json

  9. 【mongo】用户添加、导入数据库、连接VUE

    添加用户 1.安装mongo时最好用apt-get install  因为这样可以省去很多麻烦,比如一些环境变量,还有一些文档路径等等的问题 2.确认一下自己的mongodb和mongodb-clie ...

  10. Http请求加签、验证操作

    加签.验签的作用 常见的http请求交互过程中,请求参数通过url或者request body等形式传输.但是由于http请求的开放性,使得请求参数很容易被拦截篡改.因此,需要对请求参数进行加签,然后 ...