传送门

斜率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&lt;k2k1&lt;k2k1<k2&&calc(k1)&gt;calc(k2)calc(k1)&gt;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)的更多相关文章

  1. bzoj3156防御准备 斜率优化dp

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2279  Solved: 959[Submit][Status][Discuss ...

  2. BZOJ3156 防御准备 斜率优化dp

    Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sampl ...

  3. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  4. bzoj3156 防御准备 - 斜率优化

    Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 102 3 ...

  5. 【BZOJ3156】防御准备 斜率优化DP

    裸题,注意:基本的判断(求Min还是Max),因为是顺着做的,且最后一个a[i]一定要取到,所以是f[n]. DP:f[i]=min(f[j]+(i-j-1)*(i-j)/2+a[i]) 依旧设x&g ...

  6. 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)

    传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...

  7. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  8. 2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)

    传送门 终究还是通宵了啊... 这是一道简单的斜率优化dp. 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块. 于是剩下的土地有一条边单增,另外一条单减. 我们假设a[i]是单减的,b ...

  9. 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所有工厂 ...

随机推荐

  1. CUDA入门

    CUDA入门 鉴于自己的毕设需要使用GPU CUDA这项技术,想找一本入门的教材,选择了Jason Sanders等所著的书<CUDA By Example an Introduction to ...

  2. 程序员必看:给你一份详细的Spring Boot知识清单

    在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...

  3. spring-boot+quartz的CRUD动态任务管理系统

    版权声明:作者: 小柒 出处: https://blog.52itstyle.com 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大 ...

  4. J2SE 8的Lambda --- Comparator

    Person[] personArray = new Person[]{new Person("Tom"),new Person("Jack"),new Per ...

  5. RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)

    以下部署方式结合众多博友的博客,经过自己一步一步实际搭建,如有雷同,侵权行为,请见谅...其中遇到不少的坑,希望能帮到更多的人,现在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇见,那么 ...

  6. MCI 录制指定格式音频

    可先用其他格式转换软件转换一段0秒指定格式的音频,然后用mcisendstring(L"open xxx.avi alias abc",0,0,0)打开,在进行录音mcisends ...

  7. 使用sql获取primary key名称

    使用sql获取mysql主键名称: 方法1: 这种方法返回一行数据,如果只是需要主键的名称,可以使用方法2. SHOW KEYS FROM <table_name> WHERE Key_n ...

  8. Servlet Request 请求转发

    request.getRequestDispatcher("logined.jsp").forward(request, response);    //登录用户在登录页面验证通过 ...

  9. delphi常用函数和方法

     uses ShellApi, ActiveX, ComObj, ShlObj; function HasText(Text: string; const Values: array of strin ...

  10. 疯狂JAVA——第七章 java基础类库

    System类代表当前java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法.