【题目链接】 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. 原生ES-Module在浏览器中的尝试

    其实浏览器原生模块相关的支持也已经出了一两年了(我第一次知道这个事情实在2016年下半年的时候) 可以抛开webpack直接使用import之类的语法 但因为算是一个比较新的东西,所以现在基本只能自己 ...

  2. Fiddler--的一些使用技巧

    1.Filters请求与响应的会话过滤 请求会话列表中存在上百个请求,怎么过滤想要的,可以启用 Fiddler  Filters强大的过滤机制,还可以依据正则来过滤,如: REGEX:(?insx). ...

  3. bugku逗号过滤注入

    URL:http://120.24.86.145:8002/web15/ 直接给出了源码: <?php error_reporting(0); function getIp(){ $ip = ' ...

  4. SSH 登录失败:Host key verification failed 的处理方法

    原因就是你之前已经登录过这个服务器了然后改系统啥的了.导致目标主机 key 值不正确.直接把本机的key文件删除即可 sudo rm /home/yourname/.ssh/known_hosts

  5. Ubuntu 14.04 ThinkPad E431无线网卡驱动安装

    Ubuntu 14.04下安装无线网卡驱动. sudo apt-get install linux-headers-generic build-essential dkms  sudo apt-get ...

  6. python 学习笔记 sqlalchemy

    数据库表是一个二维表,包含多行多列.把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表 ...

  7. 【bzoj3223】文艺平衡树

    #include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...

  8. 【bzoj4530】大融合(LCT的子树维护)

    LCT维护子树并没有想象中的那么难,在这里只是复习下. (其他的维护子树的题目,可见:“共价大爷游长沙”) 只要记录下虚边连接的信息就好了. #include<bits/stdc++.h> ...

  9. java 和 JVM

    C++和Java的区别 指针:java中不存在指针的概念,编程者无法直接通过指针来直接访问内存,有利于维护java程序的安全 多重继承:C++支持多重继承,java不支持多重继承,但是允许一个类继承多 ...

  10. android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库

    我们的程序在32位机器上没有问题,有一天公司采购了一台魅族MX5 MTK的64位处理器上我们的应用报错了 "nativeLibraryDirectories=[/data/app/com.l ...