Description

小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于它到控制它的控制站之间的牧场数目(不包括自身,但包括控制站所在牧场)乘上该牧场的放养量,在第i个牧场建立控制站的花费是ai,每个牧场i的放养量是bi,理所当然,小P需要总花费最小,但是小P的智商有点不够用了,所以这个最小总花费就由你来算出啦。

Input

第一行一个整数 n 表示牧场数目

第二行包括n个整数,第i个整数表示ai

第三行包括n个整数,第i个整数表示bi

Output

只有一行,包括一个整数,表示最小花费

Sample Input

4
2 4 2 4
3 1 4 2

Sample Output

9
样例解释
选取牧场1,3,4建立控制站,最小费用为2+(2+1*1)+4=9。
1<=n<=1000000, 0 < a i ,bi < = 1000

Source

KpmCup#0 By Greens

Solution

1A就很开心了

非常裸的一眼斜率优化DP

设$sum_i$为$b_i$的后缀和,$s_i$为$(n-i)*b_i$的后缀和

那么DP式子很明显可以写为

$f_i=f_j+s_{j+1}-s_i-(n-i)*(sum_{j+1}-sum_{i+1})+a_i$

感性理解一下其实式很子好懂

把式子拆开后发现满足斜率单调性,直接上斜率优化就好了

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (1000000+1000)
 5 #define LL long long
 6 using namespace std;
 7
 8 LL n,a[N],b[N],sum[N],s[N],q[N],f[N];
 9
10 LL K(LL j){return sum[j+1];}
11 LL B(LL j){return f[j]+s[j+1]-n*sum[j+1];}
12 LL Y(LL i,LL j){return K(j)*i+B(j);}
13
14 bool cover(LL x1,LL x2,LL x3)
15 {
16     LL w1=(B(x2)-B(x1))*(K(x1)-K(x3));
17     LL w2=(B(x3)-B(x1))*(K(x1)-K(x2));
18     return w1<=w2;
19 }
20
21 int main()
22 {
23     scanf("%lld",&n);
24     for (int i=1; i<=n; ++i) scanf("%lld",&a[i]);
25     for (int i=1; i<=n; ++i) scanf("%lld",&b[i]);
26     for (int i=n; i>=1; --i)
27     {
28         sum[i]=sum[i+1]+b[i];
29         s[i]=s[i+1]+(n-i)*b[i];
30     }
31     int head=0,tail=0;
32     for (int i=1; i<=n; ++i)
33     {
34         while (head<tail && Y(i,q[head])>=Y(i,q[head+1])) head++;
35         f[i]=Y(i,q[head])-s[i+1]+n*sum[i+1]-i*sum[i+1]+a[i];
36         while (head<tail && cover(i,q[tail],q[tail-1])) tail--;
37         q[++tail]=i;
38     }
39     printf("%lld",f[n]);
40 }

转载于:https://www.cnblogs.com/refun/p/9279361.html

BZOJ3437:小P的牧场(斜率优化DP)相关推荐

  1. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  2. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  3. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  4. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  5. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  6. 【总结】斜率优化DP

    于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...

  7. 斜率优化dp (P2365/P5785 任务安排)

    斜率优化dp P2365 任务安排 解法一 O(N^3): 解法二:O(N^2): 代码如下: 解法三 O(N): 凸壳: 综上所述: 代码如下: P5785 [SDOI2012]任务安排 分析: 代 ...

  8. 学习笔记——斜率优化dp

    注:文中全部图片均为手绘,不喜勿喷 总论 斜率优化是dp优化中极其常用的一种手法 第一点,先要懂什么是凸包与单调队列 先来看看凸多边形是什么样 接着再是斜率及斜率优化 一.凸包及凸多边形 凸多边形 就 ...

  9. #816 Div2E. Long Way Home 斜率优化dp

    E. Long Way Home 斜率优化dp,dijkstra 题意 给定一个 n n n 个点, m m m 条边的带权无向图,边形如 < u , v , w > <u, v, ...

最新文章

  1. spring boot2.x使用rabbitmq
  2. 计算机起源于发展论文,关于计算机起源及发展的论文1500字左右,论文形式.
  3. 作为程序员,这些地方不知道就out了!
  4. Typora里字体如何变红
  5. HDU 3966-Aragorn's Story 树链剖分+树状数组
  6. python模拟登录淘宝直通车_Python实现的淘宝直通车数据抓取(1)
  7. 省选专练[NOI2008]志愿者招募
  8. Mybatis 一对多 简单映射配置
  9. GitLab CI/CD实践
  10. JS不间断无缝滚动 (兼容火狐和IE)
  11. linux自建git仓库
  12. 世界各国各地区名称代码对应表
  13. win11安装虚拟机
  14. 临时邮箱 十分钟邮箱 简介
  15. 百度顶会论文复现营论文心得
  16. 互联网寒冬,程序员如何逆流而上?
  17. 【立创EDA开源推荐】10期基于PCB彩印教程(水转印)
  18. 自然语言处理是什么,我们为什么需要处理自然语言?
  19. 给edittext每行加下划线
  20. 一个数如果恰好等于它的因子之和,这个数就称为 完数 。例如6=1+2+3.编程 找出1000以内的所有完数。

热门文章

  1. asp.net控件开发基础系列
  2. python-PyQuery详解
  3. shell脚本的学习(二)
  4. px、pt、em、rem 的区别
  5. zabbix错误提示解决
  6. 图片轮播器(swift)
  7. Tkinter Frame size
  8. UIViewController内存管理
  9. C++ Exercises(十六)---Ethernet帧包结构解析
  10. 前端技术周刊 2019-02-11 Serverless