洛谷题目传送门

用两种不一样的思路立体地理解斜率优化,你值得拥有。

题意分析

既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高(其实是蒟蒻把长方形立在了平面上)都比另一块要小,那么肯定是直接并购,这一块对答案没有任何贡献。

我们先把这些给去掉,具体做法可以是,按高为第一关键字,宽为第二关键字从大到小排序,然后上双指针扫一遍。

于是,剩下的就是一个高度递减、宽度递增的矩形序列。考虑怎样制定它们的并购方案会最优。显然如果要并购,一定要挑序列中的一段区间,这样贡献答案的就只有最左边矩形的高乘上最右边矩形的宽,中间的又是没有贡献了。

设\(f_i\)为前\(i\)个矩形的最小花费,\(w\)为宽,\(h\)为高,直接写出一个\(O(n^2)\)的方程

\[f_i=\min\limits_{j=1}^i\{f_{j-1}+w_ih_j\}
\]

一看貌似是一个决策单调性优化的式子。然而。。。。。。

初中生都会的函数图像法

这种理解方法是在决策单调性优化DP的基础上应运而生的。

或者说,(在大多数情况下)斜率优化可以看作决策单调性优化的一种特殊情形。蒟蒻建议还是先入手决策单调性再来斜率优化吧。

蒟蒻的DP各种优化总结

蒟蒻之前写的一道经典(裸)决策单调性题的题解戳这里(Lightning Conductor)

对于每一个\(f_{j-1}+w_ih_j\),我们都可以把它视为一个直线\(l_j:y=ax+b\),其中\(a=h_j,b=f_{j-1}\)。对于每一个\(i\),我们就是需要求出所有\(j\le i\)的直线的\(x\)取\(w_i\)时最小的一个\(y\)值。仍然用KmPlot画一个我们需要维护的所有直线的样子,它们应该满足斜率依次递减。

\(l_1:y=2x;\)

\(l_2:y=x+1;\)

\(l_3:y=\frac x 2+3;\)

\(l_4:y=\frac x 6+5.\)

真正有用的部分

这样的话,我们就用单调队列维护若干个斜率递减的函数。我们仍然需要按照决策单调性的做法,维护相邻两个决策直线间的临界值(交点)\(k\)。难道还要维护决策二分栈,对每个临界值都二分么?

这些决策不是直线吗?求两个直线的交点。。。。。。初中数学就教了,是\(O(1)\)的。也就是对两个相邻决策直线\(l_1,l_2\),我们求\(\frac{b_2-b_1}{a_1-a_2}\)。其它过程跟决策单调性是一模一样的。直线入队前,如果队尾不满足斜率递增则出队。求\(f_i\)之前,先把队首临界值\(\le w_i\)的决策出队,那么现在队首就是最优决策了。

这样求出\(f_n\)只需要\(O(n)\)的时间。

高中生都会的线性规划法

这才是理解斜率优化的正宗方法,因为上面并没有充分体现对斜率的处理过程。

上面对两个相邻直线求\(\frac{b_2-b_1}{a_1-a_2}\),看起来有点像求什么东西。

我们原来把决策当成直线,斜率为\(a\),截距为\(b\)。现在我们换一下。把决策\(f_{j-1}+w_ih_j\)看作一个点\(p_j(x,y)\),其中\(x=-h_j,y=f_{j-1}\)。

现在要求解的问题又变成了什么样子呢?在平面上有若干个点,把\(f_i\)看成目标函数\(z\),我们需要找到\(f_i=w_ih_j+f_{j-1}\)即\(z=-w_ix+y\)的最小值。这不是个线性规划么?

把式子变成\(y=w_ix+f_i\),现在就让我们来最小化截距\(f_i\)。手(nao)动(dong)模拟一下,我们现在正在拿着一个斜率为\(w_i\)的直线,从下往上移动,当第一次经过某个决策点的时候,直线的在\(y\)轴上的截距就是我们要求的目标函数\(f_i\)的最小值了。

随便画一堆点就可以发现,无论直线以怎样的斜率向上靠,总有一些点永远都不会第一次与直线相交,也就是说这些决策是没用的。剩下的有用的决策点会构成一个凸包:(因为要画点所以换成了GeoGebra)

凸包的性质就是斜率递增/递减。在此题中,因为\(w\)递增,所以我们的单调队列中存的是若干个点满足\(x\)递增(\(h\)递减),\(y\)递增,而且相邻两个点的斜率也递增。这和原序列的顺序是同向的。假设队尾下标为\(t\),当需要在队尾加入一个新的决策点时,我们可能会遇到这样的情况:

这时候\(p_t\)已经不优了,我们把它出队,如此直到满足斜率递增为止,\(p_i\)就可以入队了。和上面那种理解方法的写法差不多,求相邻两个点形成的直线斜率然后比一下大小。队首的处理跟上面那种理解方法的写法也差不多,如果队首与后一个的斜率小于\(w_i\)就出队。最后的队首依然是最优解。

实现

两种实现的代码长得都差不多,都要搞一个单调队列,都要求临界值/斜率。所以就放一个代码吧。。。

复杂度\(O(n\log n)\),瓶颈竟然在sort上?!蒟蒻可不想来什么wys排序

#include<cstdio>
#include<algorithm>
#define RG register
#define R RG int
#define G c=getchar()
#define Calc(i,j) (f[j-1]-f[i-1])/(a[i].h-a[j].h)
//method1:求出临界值
//method2:求出斜率
using namespace std;
const int N=1e5+9;
int q[N];
double f[N],k[N];
//method1:k_i为决策直线q_i与q_i+1的临界值(交点)
//method2:k_i为决策点q_i与q_i+1所连成直线的斜率
struct Land{
int w,h;//结构体排序
inline bool operator<(RG Land&x)const{
return h>x.h||(h==x.h&&w>x.w);
}
}a[N];
inline int in(){
RG char G;
while(c<'-')G;
R x=c&15;G;
while(c>'-')x=x*10+(c&15),G;
return x;
}
int main(){
R n=in(),i,h,t;
for(i=1;i<=n;++i)
a[i].w=in(),a[i].h=in();
sort(a+1,a+n+1);
for(h=i=1;i<=n;++i)//双指针扫描去除无用矩形
if(a[h].w<a[i].w)a[++h]=a[i];
n=h;
for(h=i=1,t=0;i<=n;++i){
while(h<t&&k[t-1]>=Calc(q[t],i))--t;//维护临界值/斜率单调
k[t]=Calc(q[t],i);q[++t]=i;//加入决策直线/决策点
while(h<t&&k[h]<=a[i].w)++h;//弹出已经不优的决策
f[i]=(double)a[q[h]].h*a[i].w+f[q[h]-1];//求出最优解
}
printf("%.0lf\n",f[n]);
return 0;
}

洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)的更多相关文章

  1. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)

    题意 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比如约翰并购一块3 ...

  2. 洛谷2900 [USACO08MAR]土地征用Land Acquisition (斜率优化+dp)

    自闭的一批....为什么斜率优化能这么自闭. 首先看到这个题的第一想法一定是按照一个维度进行排序. 那我们不妨直接按照\(h_i\)排序. 我们令\(dp[i]\)表示到了第\(i\)个矩形的答案是多 ...

  3. 洛谷 P2900 [USACO08MAR]土地征用Land Acquisition 解题报告

    P2900 [USACO08MAR]土地征用Land Acquisition 题目描述 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选 ...

  4. 【洛谷 P2900】 [USACO08MAR]土地征用Land Acquisition(斜率优化,单调栈)

    题目链接 双倍经验 设\(H\)表示长,\(W\)表示宽. 若\(H_i<H_j\)且\(W_i<W_j\),显然\(i\)对答案没有贡献. 于是把所有点按\(H\)排序,然后依次加入一个 ...

  5. luogu P2900 [USACO08MAR]土地征用Land Acquisition

    写这道题时,预处理部分少打了等号,吓得我以为斜率优化错了或者被卡精了 mmp 首先有一个很明显的结论(逃),就是一个土地如果长(\(x\))与宽(\(y\))都比另一个土地小,那么这个土地一定可以跟那 ...

  6. P2900 [USACO08MAR]土地征用Land Acquisition

    \(\color{#0066ff}{ 题目描述 }\) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些 ...

  7. [LuoguP2900] [USACO08MAR]土地征用(Land Acquisition)

    土地征用 (Link) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比 ...

  8. 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)

    洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...

  9. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

随机推荐

  1. 查看CentOS/Linux的版本信息

    今天在安装MySql的时候,想选择linux的版本对应的MySql. 1.查看内核版本和x86/x64版本 方法一.cat /proc/version [root@sxl129 Desktop]# c ...

  2. Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)

    补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...

  3. SequenceFile文件

    SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案 ...

  4. 你真的了解volatile关键字吗?

    volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于volatile的使用仍然要小心,这需要明白volatile关键字的特性及实现的原理,这也是本篇文章的主要内容. 一. ...

  5. Redis Cluster日常操作命令梳理

    在之前的一篇文章已经介绍了Redis Cluster及其部署,下面说下Redis Cluster日常操作命令: 一.以下命令是Redis Cluster集群所独有的,执行下面命令需要先登录redis: ...

  6. 保留最新N份备份目录脚本

    如下所示,在/opt/backup下是备份目录,只需要保留最新的三份备份,在此之前的备份目录都要删除. [root@syslog-ng ~]# cd /opt/backup/ [root@syslog ...

  7. Jenkins构建自动化任务

    前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 一.环境配置 1.切换到jenkins ...

  8. beta阶段测试基本概况对应机型硬件信息

    机型测试概况 测试结果 测试终端数 品牌分布分析 系统分布分析 分辨率分布 未执行 1 联想 4.0.3 480*800 安装失败 1 联想 4.2.1 480*854 通过 119 华为, 三星, ...

  9. jiedui

    源代码:https://github.com/hanzhaoyan/jieduizuoye/tree/master 功能要求: 该程序用图形界面实现下面功能:用计算机产生一个100以内的随机数,游戏者 ...

  10. Markdown页内跳转实现方法

    目录 Markdown页内跳转实现方法 HTML锚点跳转 生成目录 Markdown页内跳转实现方法 [时间:2017-02] [状态:Open] [关键词:markdown,标记语言,页内跳转,ht ...