3156: 防御准备

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 2279  Solved: 959
[Submit][Status][Discuss]

Description

 

Input

第一行为一个整数N表示战线的总长度。

第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai。

Output

共一个整数,表示最小的战线花费值。

Sample Input

10
2 3 1 5 4 5 6 3 1 2

Sample Output

18

HINT

1<=N<=10^6,1<=Ai<=10^9

Source

Katharon+#1

f[i]=f[j]+(i-j)*i-(sum[i]-sum[j])+a[i]
递推方程式和1096有点类似
sum[i]表示i到1的距离

设k<j && j 优于 k
f[j]+(i-j)*i-(sum[i]-sum[j])+a[i]<=f[k]+(i-k)*i-(sum[i]-sum[k])+a[i]
化简得f[j]-i*j+sum[j]<=f[k]-i*k+sum[k]

证明决策单调性
需要证明 对于 t>i j的决策优于k
即f[j]-t*j+sum[j]<=f[k]-t*k+sum[k]
设t=i+v 代入上式得
f[j]-i*j+sum[j]-v*j<=f[k]-i*k+sum[k]-v*k
-v*j<=-v*k 上式成立 决策单调性得证
证毕

斜率方程式
假设k<j&&j决策优与k
满足f[j]-i*j+sum[j]<=f[k]-i*k+sum[k]
=> f[j]+sum[j]-f[k]-sum[k]<=i*(j-k)
=> (f[j]+sum[j]-f[k]-sum[k])/(j-k)<=i
优化dp即可

 #include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
ll sum[N],f[N];
int n,q[N],a[N];
inline char gc(){
static char s[],*p1,*p2;
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
if(p1==p2)return EOF;return *p1++;
}
inline int read(){
int x=;char ch=gc();
while(ch<''||ch>'')ch=gc();
while(ch<=''&&ch>='')x=x*+ch-'',ch=gc();
return x;
}
ll U(int k,int j){return f[j]+sum[j]-f[k]-sum[k];}
int D(int k,int j){return j-k;}
int main(){
n=read();
for(register int i=;i<=n;++i){
a[i]=read();
sum[i]=sum[i-]+i;
}
int h=,t=,j;
for(register int i=;i<=n;++i){
while(h<t&&D(q[h],q[h+])*i>=U(q[h],q[h+]))++h;
j=q[h];f[i]=f[j]+1ll*(i-j)*i-sum[i]+sum[j]+a[i];
while(h<t&&U(q[t],q[t-])*D(i,q[t])>=U(i,q[t])*D(q[t],q[t-]))--t;
q[++t]=i;
}
printf("%lld\n",f[n]);
return ;
}

最新文章

  1. [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图
  2. linux 脚本小试系列
  3. #nav li:hover ul 与#nav li a:hover ul 的区别
  4. wpf常见枚举收集
  5. GAN
  6. 八 Appium常用方法介绍
  7. JS实现购物车特效
  8. Java中使用C3P0连接池
  9. Linux Shell基线配置高级操作
  10. F. Shovels Shop 背包DP
  11. IDEA(MAC) 快捷键
  12. url自动补全index.php
  13. c算法:字符串查找-KMP算法
  14. PLSQL数组
  15. (转)MVC 与三层架构
  16. IDEA git修改远程仓库地址
  17. matlab常用方法
  18. golang中的字符串拼接
  19. 利用Graphviz 可视化GO 数据库
  20. python 内置调试工具 pdb

热门文章

  1. vue的简单tab
  2. SENet
  3. Visual Studio Code初识与自动化构建工具安装
  4. MSSQL---extents
  5. Angular 学习笔记 ( CDK - Overlays )
  6. R语言学习 第九篇:plyr包
  7. Mysql 5.1的坑
  8. 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点
  9. python自带的web服务器
  10. 用JavaScript实现动态省市县三级联动