孤独一生

Time Limit:10000MS  Memory Limit:165536K
Total Submit:23 Accepted:11 
Case Time Limit:1000MS

Description

Input

第一行一个数N。 
第二行N个整数Hi。

Output

一行一个整数,表示最小的总体力值。

Sample Input

3
1 3 1

Sample Output

4

Hint

对于10%的数据N<=20。 
对于20%的数据N<=100。 
对于50%的数据N<=5000。 
对于100%的数据1<=N<=500000。

设f[i][j]表示第一个集合结尾是i,第二个集合结尾是j,我们考虑到这两个集合没有本质区别,所以假设i>=j

这是O(N2)

设g[i]=f[i][i-1],sum[i]=sum[i-1]+abs(h[i]-h[i-1]),我们就只需要枚举前面的g[j]就行了

转移为g[i]=min{g[j]+sum[i-1]-sum[j]+abs(h[i]-h[j-1)}

答案就是min(g[i]+sum[n]-sum[i])

绝对值就用树状数组去就可以了

code:

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 500005
#define lowbit(x) ((x)&(-(x)))
#define inf 4557430888798830399LL
using namespace std;
typedef long long int64;
char ch;
int n,tot,h[maxn],pos[maxn];
int64 sum[maxn],f[maxn],ans;
struct DATA{
int val,num;
}list[maxn];
bool cmp(DATA a,DATA b){return a.val<b.val;}
struct bit{
int64 val[maxn];
void init(){memset(val,,sizeof(val));}
void insert(int x,int64 v){for (;x<=tot;x+=lowbit(x)) val[x]=min(val[x],v);}
int64 query(int x){
int64 ans=inf;
for (;x;x-=lowbit(x)) ans=min(ans,val[x]);
return ans;
}
}T1,T2;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
int main(){
read(n),n++;
for (int i=;i<=n;i++) read(h[i]);
for (int i=;i<=n;i++) sum[i]=sum[i-]+abs(h[i]-h[i-]);
for (int i=;i<=n;i++) list[i]=(DATA){h[i],i};
sort(list+,list+n+,cmp);
pos[]=tot=;
for (int i=;i<=n;i++){
if (list[i].val!=list[i-].val) tot++;
pos[list[i].num]=tot;
}
T1.init(),T2.init();
memset(f,,sizeof(f));
f[]=,T1.insert(pos[],f[]-sum[]-h[]),T2.insert(tot-pos[]+,f[]-sum[]+h[]);
for (int i=;i<=n;i++){
f[i]=sum[i-]+min(h[i]+T1.query(pos[i]),-h[i]+T2.query(tot-pos[i]));
T1.insert(pos[i-],f[i]-sum[i]-h[i-]);
T2.insert(tot-pos[i-]+,f[i]-sum[i]+h[i-]);
}
ans=inf;
for (int i=;i<=n;i++) ans=min(ans,f[i]+sum[n]-sum[i]);
printf("%I64d\n",ans);
return ;
}

老oj3999孤独一生的更多相关文章

  1. 使用python抓取婚恋网用户数据并用决策树生成自己择偶观

    最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...

  2. Mac 开发者常用的工具

    转载:http://www.oschina.net/news/53946/mac-dev-tools 在写 Mac 程序员的十个武器之前,我决定先讲一个故事,关于 Mac 和爱情的.(你们不是问 Ma ...

  3. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

  4. C语言基础--while循环

    while循环格式: while (条件表达式) { 语句; ... }   执行说明: while是对给定的条件进行判断, 如果条件满足, 就执行while后面大括号中的内容, 执行完毕之后会再次判 ...

  5. 【转】Mac 程序员的十种武器

    http://chijianqiang.baijia.baidu.com/article/3733 上 在写 Mac 程序员的十个武器之前,我决定先讲一个故事,关于 Mac 和爱情的.(你们不是问 M ...

  6. ZT:150条毒鸡汤

    1.照照镜子吧,还要什么段子? 2.多年过去,再回忆高考,其实本质上没有考到好与坏的说法,重要的是年轻人在一起,做份试题,然后决定去哪座城市做代购. 3.真正努力过的人,就会明白天赋的重要性. 4.转 ...

  7. NodeJs 开源

    iwebpp.io - 运行P2P Node.js web 服务,穿透防火墙,NAT https://github.com/InstantWebP2P/iwebpp.io pm 是一个轻量级的Node ...

  8. github开源项目

    开源一小步,前端一大步   作为一名前端攻城狮,相信不少人已经养成了这样的习惯.当你进入一个网站,总会忍不住要打开控制台看下它是如何布局的,动画是如何实现的等.这也是前端开发者一个不错的的学习途径. ...

  9. 【.NET 深呼吸】在 .net core app 中使用 Composition

    .NET 中的 Composition ,即 MEF.MEF 说得简单一点,就是它可以在运行阶段动态地发现类型,用于组件扩展方面特别合适. .NET Core App 的默认框架并不提供 MEF 有关 ...

随机推荐

  1. Codeforces Round #326 (Div. 1) - C. Duff in the Army 树上倍增算法

    题意:一个n个点的数, m个人住在其中的某些点上, 每个人的标号1-m, 询问u-v 路径上标号前a个人,并输出标号,a < 10. 作法, 利用倍增, ID[j][i] 表示i到i的第2^j个 ...

  2. poj1323

    题目大意: 预测游戏 假如有MR人,包括你自己,玩一个特殊的卡片游戏,开始的时候,没有参与者接收到N张卡片,这pip卡片是一个正整数最少M*N,没有两张pip卡片是一样的,在一圈后,每个玩家选择一张卡 ...

  3. OC类方法和实例方法 及常用的for/in方法

    类方法前面有+,实例方法前面有- 类方法和实例方法的区别在于,类方法不能使用实例变量. 使用类方法主要原因有: 1.类方法的使用不依赖于实例化一个对象,也就是说如果一个功能的实现不需要实例化对象,就可 ...

  4. UVa 674: Coin Change

    动态规划题.对于1,5,10,25,50五种币值的硬币,编号为0~4,存入数组cent中.数组iWay的元素iWay[k][i]表示仅使用0~i的硬币凑出k分钱的方法数,按是否使用编号为i的硬币分类, ...

  5. Maven deploy

      1.在maven/conf/setting.xml中: 在<servers>中加入 <server> <id>internal</id> <u ...

  6. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  7. linux 屏幕亮度调整命令

    我的Fujitsu S7211的笔记本屏幕显示在Ubuntu 10.04不如在Vista下明亮,一直以为是驱动的问题.后来从老外的博客中,发现了这个亮度其实可以调节. 2种方法: 1. 调节屏幕对比度 ...

  8. 黑白图像(DFS)

    输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如图6-11所示的图形有3个八连块. 图6-11  拥有3 ...

  9. MongoDB C++ 2.4.5 driver 编译安装问题

    安装参考前文,http://blog.csdn.net/sheismylife/article/details/8794589 方法一致.只不过这次在GCC4.8.1上编译. scons instal ...

  10. 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制

    2.1 Android IPC简介 (1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来 ...