[BZOJ3156]防御准备(斜率优化dp)
来源:互联网 发布:商务通弹窗js代码 编辑:程序博客网 时间:2024/05/17 09:23
题目描述
传送门
题解
首先把序列反置,然后就变成了都挪向左边,第一个必须建守卫塔
fi表示在i点建守卫塔的费用总和,转移方程:
注意这里第一个必须选,所以开始的队列不能为0,应该为1。并且最后一个可以不选,单独枚举。
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long longconst int max_n=1e6+5;const LL INF=1e9;int n,head,tail,q[max_n];LL cost[max_n],d[max_n],s[max_n],c[max_n],f[max_n];LL ans;inline LL K(int j){return -d[j];}inline LL B(int j){return f[j]-s[j]+c[j]*d[j];}inline LL Y(int i,int j){return K(j)*c[i-1]+B(j);}inline bool cmp(int x1,int x2,int x3){ LL w1=(K(x1)-K(x3))*(B(x2)-B(x1)); LL w2=(K(x1)-K(x2))*(B(x3)-B(x1)); return w1>=w2;}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%lld",&cost[i]); for (int i=1;i<=n/2;++i) swap(cost[i],cost[n-i+1]); d[1]=0; for (int i=2;i<=n;++i) d[i]=d[i-1]+1; for (int i=1;i<=n;++i) s[i]=s[i-1]+d[i]; for (int i=1;i<=n;++i) c[i]=c[i-1]+1; head=0;tail=0; q[tail]=1; f[1]=cost[1]; for (int i=2;i<=n;++i){ while (head<tail&&Y(i,q[head])>=Y(i,q[head+1])) head++; f[i]=Y(i,q[head])+s[i-1]+cost[i]; while (head<tail&&cmp(i,q[tail-1],q[tail])) tail--; q[++tail]=i; } ans=f[n]; for (int i=1;i<n;++i) ans=min(ans,f[i]+s[n]-s[i]-d[i]*(c[n]-c[i])); printf("%lld\n",ans);}
0 0
- [BZOJ3156]防御准备(斜率优化dp)
- bzoj3156: 防御准备(斜率优化+Dp)
- bzoj3156: 防御准备 斜率优化DP
- 【BZOJ3156】防御准备 斜率优化DP
- 【BZOJ3156】防御准备,斜率优化DP
- [bzoj3156] 防御准备 DP斜率优化
- BZOJ3156: 防御准备 【斜率优化dp】
- [bzoj3156][dp+斜率优化]防御准备
- bzoj3156 防御准备(斜率优化)
- bzoj3156 防御准备(斜率)
- BZOJ3156 防御准备 水水的斜率优化(斜率优化总结)
- bzoj3156(斜率优化DP)
- bzoj3156(斜率优化)
- bzoj 3156 防御准备(斜率优化+DP)
- BZOJ 3156 防御准备 斜率优化DP
- bzoj 3156 防御准备 斜率优化+DP
- [BZOJ 3156]防御准备(斜率优化DP)
- 3156: 防御准备|DP|斜率优化
- android library projects cannot be launched问题
- iOS将数字转成货币格式字符串
- 修理桌子-Java
- XtraBackup/innobackupex 远程备份MySQL
- didn't meet stated Content-length,wrote:'133' bytes instead of stated '204' bytes
- [BZOJ3156]防御准备(斜率优化dp)
- git的简单实战使用
- iOS Sqlite的详解
- Android多种样式的进度条
- ValueAnimator的介绍与使用
- java的无参构造器和super()
- ubuntu硬盘i设置密码
- mvc和三层架构
- testng实现verify断言