【题目链接】 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;
}

最新文章

  1. DateTable利用NPOI导出Excel 公共方法
  2. oracle+servlet+extjs4 分页表格布局示例代码
  3. 利用scp传输文件小结
  4. iis 访问网站需要进行身份验证
  5. 转simhash与重复信息识别
  6. php最新出现的函数
  7. Cutting Sticks
  8. 自定义Window进入和退出效果(转)
  9. C/C++捕获段错误,打印出错的具体位置(精确到哪一行)
  10. 清华集训2014 day2 task1 简单回路
  11. WinSpy涉及的windows api
  12. 在利用node连接数据库遇到的问题
  13. SAP主数据文件版本号命名规范
  14. macOS 10.13 High Sierra odoo11 开发配置--完整版
  15. 搭建RESTful API 之 实现WSGI服务的URL映射
  16. jquerymobile动态添的无索刷新
  17. 前端js获取checkbox的值
  18. 《鸟哥的Linux私房菜》学习笔记0——计算机概论
  19. Zend Studio 12 windows 无限期试用
  20. 微软儿童编程技术,kodu(酷豆)为儿童创造一个游戏世界

热门文章

  1. DotNETCore 学习笔记 WebApi
  2. web-project 故障查看功能 检测是否启动fmd服务
  3. Python 模块搜索路径 -- (转)
  4. ES6新增的let与const
  5. php中类的static变量使用
  6. 檢查 cpu 的全部 gpio 狀態及設定
  7. Bzoj-2301 [HAOI2011]Problem b 容斥原理,Mobius反演,分块
  8. 2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂
  9. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
  10. 在 Visual Studio 中使用正则表达式