3437: 小P的牧场

3437: 小P的牧场

思路

  斜率优化。

  dp[i]表示到第i个点(第i个点按控制台)的最小代价。

代码

 1 #include<cstdio>
 2 #include<iostream>
 3
 4 using namespace std;
 5 typedef long long LL;
 6
 7 const int N = 1000100;
 8 LL f[N],s[N],a[N],b[N];
 9 int q[N],L,R;
10
11 inline int read() {
12     int x = 0,f = 1;char ch = getchar();
13     for (; !isdigit(ch); ch=getchar()) if(ch==‘-‘) f=-1;
14     for (; isdigit(ch); ch=getchar()) x = x*10+ch-‘0‘;
15     return x * f;
16 }
17 double Slope(int i,int j) {
18     return 1.0*(f[i]+s[i]-f[j]-s[j])/(1.0*(b[i]-b[j]));
19 }
20 int main() {
21     int n = read();
22     for (int i=1; i<=n; ++i) a[i] = read();
23     for (int i=1; i<=n; ++i) {
24         b[i] = read();
25         s[i] = s[i-1] + 1ll * b[i] * i;
26         b[i] += b[i-1];  // 顺序不能反!
27     }
28     int L = 1,R = 1;
29     q[1] = 0;
30     for (int i=1; i<=n; ++i) {
31         while (L<R && Slope(q[L],q[L+1]) < (double)i) L++;
32         int j = q[L];
33         f[i] = f[j] + i * (b[i-1] - b[j]) - (s[i-1] - s[j]) + a[i];
34         while (L<R && Slope(q[R-1],q[R]) > Slope(q[R],i)) R--;
35         q[++R] = i;
36     }
37     cout << f[n];
38     return 0;
39 }

原文地址:https://www.cnblogs.com/mjtcn/p/8977314.html

时间: 2024-10-07 09:05:21

3437: 小P的牧场的相关文章

bzoj 3437: 小P的牧场 -- 斜率优化

3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控

BZOJ 3437 小P的牧场 斜率优化DP

题目大意:有些按照一字排列的牧场,每一个牧场有一个费用和放牧数量.现在要在一些牧场上建造控制站,目的是控制所有的牧场,建立控制站的基础费用就是每个牧场的费用,然后每一个牧场需要付这个牧场的放养数量*它与右边相邻的控制站的距离.求最小的费用. 思路:直接弄有些不好弄,需要两个前缀和来进行差分. sum[i] = Σsrc[i] _sum[i] = Σsrc[i]*i 然后DP方程就是f[i] = f[j] + (sum[i] - sum[j]) * i - _sum[i] + _sum[j] 简单

bzoj3437小P的牧场 斜率优化dp

3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1542  Solved: 849[Submit][Status][Discuss] Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被

BZOJ3437:小P的牧场(DP+斜率优化)

小P的牧场[题目描述]背景:小P 是个特么喜欢玩MC 的孩纸...小P 在MC 里有n 个牧场,自西向东呈一字形排列(自西向东用1…n 编号),于是他就烦恼了:为了控制这n 个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于

bzoj3437小P的牧场

bzoj3437小P的牧场 题意: n个牧场,在每个牧场见控制站的花费为ai,在该处建控制站能控制从此处到左边第一个控制站(或边界)之间的牧场.一个牧场被控制的花费等于它到控制它的控制站之间的牧场数目(不包括自身,但包括控制站所在牧场)乘上该牧场的放养量.求最小费用. 题解: 推公式: f[i]=f[j]+sigma(k,j+1,i)((i-k)*b[k])+a[i] =f[j]+sigma(k,j+1,i)(i*b[k]-k*b[k])+a[i] =f[j]+sigma(k,j+1,i)(i*

【bzoj 3437】小P的牧场

Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1-n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于它到控制它的控制站之间的牧场数目(不包括自身,但包括

【BZOJ】【3437】小P的牧场

DP/斜率优化 斜率优化基本题……等等,好像就没啥变化啊= = 嗯目测这题跟仓库建设差不多?写题的时候倒是没想这么多……直接推了公式. $$f[i]=min\{f[j]+cal(j,i)+a[i]\}$$ 哦麻烦的还是这个$cal(j,i)$ 我们令$s[i]=\sum_{k=1}^{i}b[k]  c[i]=\sum_{k=1}^{i}(b[k]*k)$ 则有$cal(j,i)=(s[i]-s[j])*i-(c[i]-c[j])$(问我怎么想到的?这个嘛……像这题这种要求“阶梯形求和”的,基本

BZOJ3437 小P的牧场(斜率优化dp)

题目link:http://www.lydsy.com/JudgeOnline/problem.php?id=3437; 略略读一下题,发现这题是一道dp 有一些牧场: 1 2 3 4 5 6 7 8 9 10 其中编号大的可以管住编号小的. a[i]表示建站费用 b[i]表示养殖奶牛数目 dp方程大概就出来了 f[i]=min(f[j]+cost(j+1,i)) (0<j<i); 可是有些问题需要O(1)计算cost(j+1,i); 怎么办呢? 于是我想了一个很不清真的计算方法 开了两个数组

【BZOJ3437】小P的牧场 斜率优化 动态规划

呃,老规矩,方程.转化神马的都在代码注释里面. 不会斜率优化的移步这篇:http://blog.csdn.net/vmurder/article/details/41648159 没事闲的想看点经验的来"前一篇"http://blog.csdn.net/vmurder/article/details/41682901 代码: #include <cstdio> #include <cstring> #include <iostream> #inclu