孤独一生

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 ;
}

最新文章

  1. 加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案
  2. C#之关机事件
  3. ajax跳转传参
  4. BZOJ 1468 &amp; 点分治
  5. OC语言-02-OC语言-基础知识
  6. 夺命雷公狗ThinkPHP项目之----企业网站30之网站前台头部导航的高亮显示
  7. tachyon 集群容错
  8. WCF大数据量传输解决方案
  9. FP-Tree算法的实现
  10. [Android] 输入系统(三):加载按键映射
  11. iOS多线程系列(3)
  12. shouldOverrideUrlLoading相关说明
  13. jquery实现横向导航
  14. 读书笔记 effective c++ Item 10 让赋值运算符返回指向*this的引用
  15. Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期
  16. Python 3 Anaconda 下爬虫学习与爬虫实践 (1)
  17. Python对象迭代与反迭代相关问题与解决技巧
  18. CSS之浏览器默认样式问题
  19. os、os.path模块中关于文件、目录常用的函数使用方法
  20. Apache和Nginx的Rewrite规则对比

热门文章

  1. Uncle Sam 山姆大叔
  2. warning: Could not canonicalize hostname: vpn
  3. 剪花布条 - HDU 2087(简单KMP | 暴力)
  4. poj3122
  5. Demo_玩家移动(主要注意动画的设置)
  6. java 获取黑屏信息保存在list中,截取字符执行
  7. 18、MySQL内存体系架构及参数总结
  8. linux 之 yum 介绍 &lt;转&gt;
  9. POJ 3449 Geometric Shapes (求正方形的另外两点)
  10. 【iOS UISearchBar父控件是UIScrollView时,上移的问题】