【BZOJ3156】防御准备 斜率优化

【BZOJ3156】防御准备

Description

Input

第一行为一个整数N表示战线的总长度。

第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai。

Output

共一个整数,表示最小的战线花费值。

Sample Input

10

2 3 1 5 4 5 6 3 1 2

Sample Output

18

HINT

1<=N<=10^6,1<=Ai<=10^9

题解:一眼看出斜率优化DP,先列出方程再说

整理一下,发现求的是下凸包,且点的坐标单调不减

题目图片太大导致不能再加图片了好气~

#include <cstdio>
#include <iostream>
#include <cstring>
#define y(_) (f[_]+_*(_+1)/2)
using namespace std;
typedef long long ll;
const int maxn=1000010;
int n;
ll q[maxn],h,t;
ll a[maxn],f[maxn];
int main()
{
	scanf("%d",&n);
	ll i;
	for(i=1;i<=n;i++)	scanf("%lld",&a[i]);
	h=t=1;
	for(i=1;i<=n;i++)
	{
		while(h<t&&(y(q[h+1])-y(q[h]))<=i*(q[h+1]-q[h]))	h++;
		f[i]=f[q[h]]+(i-q[h])*(i-q[h]-1)/2+a[i];
		while(h<t&&(y(q[t])-y(q[t-1]))*(i-q[t])>=(y(i)-y(q[t]))*(q[t]-q[t-1]))	t--;
		q[++t]=i;
	}
	printf("%lld",f[n]);
	return 0;
}
时间: 2024-10-05 02:44:23

【BZOJ3156】防御准备 斜率优化的相关文章

[BZOJ3156]防御准备 斜率优化DP

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3156 裸的斜率优化,记一下以后复习用吧. 要直接dp很明显应该要倒着dp,很不爽,先把它倒过来. 令$sum[j]=\sum_{i=1}^ji$,于是我们首先推出这样一个方程$$f[i]=min\{f[j]+sum[i-1]-sum[j]-(i-j-1)*j+a[i]\}$$ 这样dp复杂度是$O(n^{2})$的,考虑斜率优化. 设$k>j$,且$k$优于$j$,则有$$f[k]+su

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

老规矩,方程什么都在注释里面. 呃,其实写斜率优化不妨像我这么写,先把会TLE的裸dp交一遍,T了以后就把方程去掉(long long)这种类型转化神马的粘到注释里面,然后j放一边,i放一边,都有的放到i的一边,然后列出yxkb,然后最大上凸,最小下凹,简单分析,不对再改,然后来俩点判断判断叉积神马的,然后一遍ac. 嘲讽一下:某同学POJ一道题调了一天至今还没过..代码风格啊... 不会斜率优化的往我博客分类里其它博客翻. #include <cstdio> #include <cst

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

3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 题解: 斜率优化DP: 首先将数组倒置 设定dp[i] 为前i的点的最优答案 易得 dp[i] = min{dp[j

【BZOJ-3156】防御准备 DP + 斜率优化

3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 951  Solved: 446[Submit][Status][Discuss] Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HIN

BZOJ3156 防御准备 动态规划 斜率优化

原文链接http://www.cnblogs.com/zhouzhendong/p/8688187.html 题目传送门 - BZOJ3156 题意 长为$n$的序列$A$划分,设某一段为$[i,j]$,则其花费为$A_j+\sum_{k=i}^{j}(j-k)$. 一种划分方式的花费就是他每一段的花费和. 最小化花费. $n\leq 10^6$ 题解 斜率优化裸题. 设$dp_i$表示序列前$i$项通过划分可以到的最小花费. 则 $$dp_i=min\{dp_j+a_i+\frac{(i-j)

斜率优化专题3——bzoj 3156 防御准备 题解

[原题] 3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 198  Solved: 107 [Submit][Status] Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT

三练斜率优化

[bzoj3156]防御准备 试题描述 背景 在美丽富饶的Katharon国中生活着一群快乐的小木偶.他们衣食无忧,自给自足.然而在某一天,来自外形的X过要对Katharon国,发起攻击,国家安危迫在眉睫,下面请你来做战前的防御准备工作. 描述 我们定义战线为一条长度为n的序列,在这条战线上共设有n个检查点,从左到右依次标号为1到n.一个战线为合法战线当且仅当任意一个检查点可以通过安全检查.对于第i个检查点可以通过安全检查的方式有两种,第一种是放置一个守卫塔,这将花费ai的费用.第二种方式是放置

DP 斜率优化题目/决策单调性题目

斜率优化 冬令营讲到了dp斜率优化后瞎写了一些斜率优化,因为毕竟上次写是老早以前了,当时对这个并不是很理解,现在有一点数学基础,稍微好一点了. 瞎找的斜率优化题,可能有点太水了,我这种这么菜的人竟然都切得那么快.可能难度不够,因为有个y坐标不单调要套个平衡树的我是真不会,这个嘛以后再说了. 1.hdu3507 Print Article 给定非负数列,划成若干块,每块价值是左边那玩意儿.求总权值min. 这个自己写写就可以搞出来了吧,现在看真心不难,除非数值有负的..那个要平衡树,现在写不动.

bzoj3156防御准备

3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1349  Solved: 605[Submit][Status][Discuss] Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HI