传送门

斜率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. [转]使用RTT(Real-Time Terminal)

    转自http://siever.info/home/hello-world/ Bluetooth Low Energy Logging events with on Nordic’s nRF seri ...

  2. JVM jstat 详解

    http://www.ityouknow.com/java/2017/03/01/jvm-overview.html 本文基于JDK1.8 https://blog.csdn.net/maosijun ...

  3. java 观察者模式 与spring配置

    一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...

  4. Oracle VM VirtualBox做好虚拟硬盘后,如何进一步修改虚拟硬盘的大小

    以管理员身份打开, 命令提示符窗口,然后利用命令cd进入Oracle VM VirtualBox安装目录,如下图: 我进入了Oracle VM VirtualBox安装目录:D:\Program Fi ...

  5. 深入MySQL用户自定义变量

    一.到底MySQL的变量分哪几类? MySQL变量一共分为两大类:用户自定义变量和系统变量.如下: 用户自定义变量 局部变量 会话变量 系统变量 会话变量 全局变量 本文涉及的内容为用户自定义会话变量 ...

  6. java中checked和unchecked 异常处理

    有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译 ...

  7. java写简单Excel 首行是目录 然后前台下载

    页面: <form action="${path}/xxx/xxx.do" method="get" > 表格下载:<input type=& ...

  8. IIS7配置下载apk以及目录浏览

    IIS7为了增加安全性,如果需要禁止目录浏览.只需要按下面的步骤执行就可以 1.选择站点:2.选择功能视图:3.选择IIS下面的目录浏览:4.在右上角的操作中选择“打开功能”:5.选择右边的禁用. 今 ...

  9. vue 实例生命周期

    compile template into render function 编译模板渲染方法 compile el’s ouoterHtml as template 将el的outerHTML当做模板 ...

  10. Unity3d dll 热更新 基础框架

    APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...