2018.09.29 bzoj3156: 防御准备(斜率优化dp)
传送门
斜率dp经典题目。
然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2。
这道题我用了两个数组来表示状态。
f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值。
g[i]g[i]g[i]表示最后i个位置倒数第i个放塔的最优值。
a[i]a[i]a[i]是倒数第i个放塔的花费
于是有:
g[i]=ming[i]=ming[i]=min{f[i−1],g[i−1]f[i-1],g[i-1]f[i−1],g[i−1]}+a[i]+a[i]+a[i]
f[i]=minf[i]=minf[i]=min{g[j]+(i−j+1)∗(i−j)g[j]+(i-j+1)*(i-j)g[j]+(i−j+1)∗(i−j)}
然后如果k1<k2k1<k2k1<k2&&calc(k1)>calc(k2)calc(k1)>calc(k2)calc(k1)>calc(k2)
=>2∗g[j]−2∗g[i]+j∗j−i∗i−j+i(−i≤2∗i\frac {2*g[j]-2*g[i]+j*j-i*i-j+i}{(-i}\le 2*i(−i2∗g[j]−2∗g[i]+j∗j−i∗i−j+i≤2∗i(注意下标的乘积是会爆int的!!!)
这样维护一个下凸壳转移就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,q[N],hd,tl;
ll a[N],f[N],g[N];
inline ll calcX(int i,int j){return j-i;}
inline ll calcY(int i,int j){return 2*g[j]-2*g[i]+1ll*j*j-1ll*i*i-j+i;}
int main(){
n=read();
for(int i=n;i;--i)a[i]=read();
g[1]=a[1],hd=tl=1,q[1]=1,f[1]=2e9;
for(int i=2;i<=n;++i){
g[i]=min(f[i-1],g[i-1])+a[i];
while(hd<tl&&calcY(q[hd],q[hd+1])<=2*i*calcX(q[hd],q[hd+1]))++hd;
int k=q[hd];
f[i]=g[k]+1ll*(i-k+1)*(i-k)/2ll;
while(hd<tl&&calcY(q[tl-1],q[tl])*calcX(q[tl],i)>=calcY(q[tl],i)*calcX(q[tl-1],q[tl]))--tl;
q[++tl]=i;
}
printf("%lld",min(f[n],g[n]));
return 0;
}
2018.09.29 bzoj3156: 防御准备(斜率优化dp)的更多相关文章
- bzoj3156防御准备 斜率优化dp
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2279 Solved: 959[Submit][Status][Discuss ...
- BZOJ3156 防御准备 斜率优化dp
Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sampl ...
- BZOJ 3156: 防御准备 斜率优化DP
3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...
- bzoj3156 防御准备 - 斜率优化
Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 102 3 ...
- 【BZOJ3156】防御准备 斜率优化DP
裸题,注意:基本的判断(求Min还是Max),因为是顺着做的,且最后一个a[i]一定要取到,所以是f[n]. DP:f[i]=min(f[j]+(i-j-1)*(i-j)/2+a[i]) 依旧设x&g ...
- 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)
传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...
- [BZOJ3156]防御准备(斜率优化DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP
- 2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)
传送门 终究还是通宵了啊... 这是一道简单的斜率优化dp. 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块. 于是剩下的土地有一条边单增,另外一条单减. 我们假设a[i]是单减的,b ...
- 2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)
传送门 斜率优化dp经典题. 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]. 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂 ...
随机推荐
- mysql 解除安全模式
问题:rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE t ...
- 列表(ul ol dl)
Title 1 2 3 1 2 3 a 1 2 b 1 2 <!DOCTYPE html> <html lang="en"> <head> &l ...
- 遍历Datatable
//方法一 DataSet dataSet = new DataSet(); DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count; i++) ...
- 【转】oracle 体系结构
前几天面试的时候面试官才问过我Oracle的体系结构,让我在一张白纸上画出来.回头想想当时答得还不错,大部分内容都描述出来了,呵呵,刚才在网上看到一篇讲解ORACLE体系结构的文章,觉得不错,转过来存 ...
- conductor 事件处理程序
Introduction conductor中的事件提供工作流之间的松散耦合,并支持从外部系统生成和消耗事件. 包括: 1. 能够在外部系统像SQS或Conductor内部生成一个事件(消息). 2. ...
- centos7 /etc/profile /etc/bashrc
在/etc/profile中添加环境变量后,是使用source /etc/profile编译后只能在当前终端生效 重新开启一个终端后,该环境变量失效. 解决方法: 重启系统:reboot,问题解决 环 ...
- appcan更新
升级用到了config.xml文件中配置的‘更新地址‘所填写的url,此url开发者可任意配置自己的服务器地址* 当app执行uexWidget.checkUpdate()时,AppCan会请求上述u ...
- for循环语句个人小结
重新看了一下光盘上的用for循环写一个菱形的答案,发现了其实有几点是可以灵活运用的: 1,当定义行数的时候,也可以用相等的间断的数字隔开,比如 for(int a = 5; a >= 1; a- ...
- Frog and Portal(思维好题)
Frog and Portal https://hihocoder.com/problemset/problem/1873 时间限制:1000ms 单点时限:1000ms 内存限制:512MB 描述 ...
- Swift 项目中可能用到的第三方框架
这里记录下swift开发中可能用的框架 , 最近浏览了不少,积累在这里,以后用的时候方便查阅.顺便推荐给大家! 这里的框架都是纯swift的 , 感谢开源 ,感谢大神们 . 下拉刷新 BreakOut ...