bzoj3156 防御准备

3156: 防御准备

Time Limit: 10 Sec  Memory Limit: 512 MB

Submit: 981  Solved: 462

[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

HINT

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

Source

Katharon+#1

斜率优化DP

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 1000005
using namespace std;
int n,l,r,a[maxn];
ll q[maxn],f[maxn];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline double getk(ll x,ll y)
{
	return (double)(f[x]+(x*x+x)/2-f[y]-(y*y+y)/2)/(double)(x-y);
}
int main()
{
	n=read();
	F(i,1,n) a[i]=read();
	l=r=1;q[1]=0;
	for(ll i=1;i<=n;i++)
	{
		while (l<r&&getk(q[l],q[l+1])<i) l++;
		f[i]=f[q[l]]+(q[l]*q[l]+q[l])/2-q[l]*i+a[i]+(i*i-i)/2;
		while (l<r&&getk(q[r-1],q[r])>getk(q[r],i)) r--;
		q[++r]=i;
	}
	printf("%lld\n",f[n]);
	return 0;
}
时间: 2024-08-10 02:08:09

bzoj3156 防御准备的相关文章

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

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)

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

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

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

【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,先列出方程再说 整理一下,发现求的是下凸包,且点的坐标单调不减 题目图片太大导致

【bzoj3156】 防御准备

http://www.lydsy.com/JudgeOnline/problem.php?id=3156 (题目链接) 题意 给出n个防御节点,每个节点有两种选择,可以花费a[i]建立一个防御塔,或者放置一个木偶,木偶的花费为到右端第一个防御塔的距离.求最少花费. Solution 容易写出dp方程:$${f[i]=Min(f[j]+\frac{(i-j)*(i-j-1)}{2})}$$ 其中${f[i]}$表示在${i}$处放置防御塔,前${i}$个节点已经完成防御所需要的最少花费. 易证决策

【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】防御准备 斜率优化DP

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