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所有工厂 ...
随机推荐
- NDK开发中的一个HTTP下载实例附带下载进度
有一个控制下载的管理类吧,调用http下载类进行各种下载,同时在下载过程中可以显示其下载的进度,而且在每个下载结束之后以类似回调的方式告诉管理类,以继续进行后续的操作. 直接代码: .h文件 #pra ...
- linux no space left on device
一般有两个原因: 1.磁盘空间不足 2.inode不足 用df -h查看磁盘空间使用情况 用df -i查看inode使用情况
- jenkins 没有maven选项,怎么办
第一步: 进入jenkins,点系统管理 第二:插件管理 点击“可选插件” 然后在右边的过滤输入框中输入搜索关键字: Maven Integration 或者 Pipeline Maven Int ...
- Python基础杂点
Black Hat Python Python Programming for Hackers and Pentesters by Justin Seitz December 2014, 192 p ...
- SciTE: 中文字符支持问题
SciTE: 中文字符支持问题 SciTE(Scintilla Text Editor)是一个体积小巧的文本编辑器. 但是它默认的设置对中文字符处理不好,其实只要对它进行相应的配置,就可以了. 1 ...
- 【Java】JVM(三)、Java垃圾收集器
一.Minor GC.Major GC 和 Full GC Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC Major GC:清理老年代空间 Full GC:清理Ja ...
- form 表单排序
<html> <head></head> <body> <form class="form-inline"> ...
- Node.js的知识点框架整理
背景:因为appium是基于Node.js的,所以想看一下Node.js.但是发现很多资料的顺序看起来有点颠倒.然后就一面看资料一面整理了一下大概的知识点框架,希望对自己对别人有用. 本文不包含nod ...
- jquery 使用方法(转载)
原文地址:http://www.cnblogs.com/Chenfengtao/archive/2012/01/12/2320490.html jQuery是目前使用最广泛的javascript函数库 ...
- 可重入函数reentrant function
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数:而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能 ...