bzoj3156

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

这题还是裸的,就是先把输入反向,然后就是斜率优化,这里注意的是那个,

每个反向后就可以以当前为最后一个了,这样答案就不一定是f[n]了,每次计算一次,

在i这里建立最后一个的总花费,求出最小值。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define ll long long
 7 using namespace std;
 8
 9 const int NN=1e6+7;
10
11 int n,l,r;
12 int a[1000005],q[1000005];
13 ll ans,f[1000005],sum[1000005];//这里f可以理解为最后建的小花费。
14
15 double slop(ll j,ll k)
16 {
17     return (f[j]-f[k]-sum[j]+sum[k]+j-k+j*j-k*k)/(double)(j-k);//这个式子比较好推
18 }
19 void init()
20 {
21     ans=1e16+7;
22     scanf("%d",&n);
23     for(int i=n;i>=1;i--)
24         scanf("%d",&a[i]);
25     for(int i=1;i<=n;i++)
26         sum[i]=sum[i-1]+i;
27 }
28 int main()
29 {
30     init();
31     f[1]=a[1];q[1]=1;l=r=1;//开头先放进去
32     ans=min(ans,f[1]+sum[n]-sum[1]-n+1);//不能遗漏每一种情况。
33     for(int i=2;i<=n;i++)
34     {
35         while(l<r&&slop(q[l],q[l+1])<i)l++;
36         int t=q[l];
37         f[i]=f[t]+sum[i-1]-sum[t]-(ll)(i-t-1)*t+a[i];
38         ans=min(ans,f[i]+sum[n]-sum[i]-(ll)(n-i)*i);//因为不一定要最后一个地方建木偶。
39         while(l<r&&slop(q[r-1],q[r])>slop(q[r],i))r--;//找下凸包。
40         q[++r]=i;
41     }
42     printf("%lld",ans);
43 }
时间: 2024-08-10 00:06:18

bzoj3156的相关文章

【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}$个节点已经完成防御所需要的最少花费. 易证决策

【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.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

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

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 防御准备

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 H

[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

【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

20160619~20160625 8

20160620 1.bzoj3172 http://www.lydsy.com/JudgeOnline/problem.php?id=3172 题意:某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.注意论文中单词之间是有分隔的.单词数≤200,长度≤1000000 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm>