zhangtj

导航

Sol - P2900 [USACO08MAR] Land Acquisition G

完整准确地理解 FlushHu 的题解

0x00 初步分析

我们发现对于矩形 \(i,j\) 满足 \(h_i\leq h_j,w_i\leq w_j\),那么选 \(j\) 的时候一定可以并购 \(i\),因此将 \(i\) 删去。

将剩下的矩形按照 \(h\) 从大到小排序,此时 \(w\) 从小到大。

因为如果合并的不是一段连续区间,那么中间未被合并的部分一定可以合并。所以我们每次合并一段连续区间就好了。

\(f_i\) 为买下前 \(i\) 块土地的最小费用。

\[f_i=\min\{f_{j-1}+h_jw_i\} \]

0x10 对函数进行分析

我们将 \(y_j=h_jw_i+f_{j-1}\) 视作一个 \(f_{j-1}\)\(h_j\) 为常量,\(w_i\) 为变量 的一次函数。

事实上需要对每个 \(w_i\) 维护直线 \(y_{1\sim i}\) 上对应的值中最小的一个。

维护一个临界值 \(k\) 的单调队列。

每次加入一条直线时,斜率 \(h_j\) 递减,求得与队尾直线的临界点 \(k\)

因为 \(w_i\) 递增,我们每次将队首临界值 \(k\leq w_i\) 的删除,队首即为最优决策。

0x11 更本质地理解斜率优化

\(f_i=\min\{h_jw_i+f_{j-1}\}\),相当于对于每个 \(j\)\(f_{j-1}=-h_jw_i+t_j\)\(f_i=\min\{t_j\}\)

我们把 \((-h_j,f_{j-1})\) 视作二维平面上一个点。

想象我们正拿着一个斜率为 \(w_i\) 的直线从下到上,遇到第一个时纵截距 \(f_i\) 取到最小值。

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

在此题中,因为 \(w\) 递增,所以我们的单调队列中存的是若干个点满足 \(-h_j\) 递增(即 \(h_j\) 递减),\(f_{j-1}\) 递增,而且相邻两个点的斜率也递增。

插入新决策点时可能会遇到下图情况:

一直将队尾 \(t\) 出队,直到加入 \(i\) 后斜率仍递增。

我们再看回凸包那张图,手模一下,如果当前转移到 \(i\),一直将队首出队,直到队首和后一个的直线的斜率 \(>w_i\)

此时队首即为能使 \(f_i\) 取得最小值的决策点。

0x12 更简单地理解斜率优化

当前以 \(i\) 结尾,有任意决策点 \(j,k\) 满足 \(1 \leq j<k\leq i\),如果 \(i\)\(j\) 更优,那么必定满足:

\[f_{j-1}+h_jw_i\geq f_{k-1}+h_kw_i \]

也即:

\[w_i\geq \frac{f_{k-1}-f_{j-1}}{h_j-h_k} \]

\(w\) 单调递增,我们维护一个斜率 \(\frac{f_{j}-f_{j-1}}{h_{j+1}-h_j}\) 单调递减(即为下凸)的队列。

易证不在队列中的一定不会成为最优决策点。

0x20 总结

许多人轻易地看出了其中的玄机,但这仅仅只是日复一日的训练能够达到的吗?考场真的有足够的时间去思考吗?

当你参加比赛时,你会知道那不仅是短时间碰撞出的思维火花,更是平凡日子中对知识的深层认识和融会贯通。

正如大师所说:

题感做题就像盲人摸象,反复探索各个部位,不同局部性质难以联系,尝试很多次才能逐渐得到整体认知。而如果先知道了象的大致形态(问题的研究对象和可能的表示),再对具体的部位做研究逐步填充,局部之间是有联系的,自然探索起来事半功倍。

参考文献

[1]FlushHu. 题解 P2900[Z/OL].(2018-08-19)[2024-11-10].https://www.luogu.com.cn/article/z9eh1cp4

[2]刘承奥. 蔡德仁随笔:一些 OI 教学研究的故事[Z/OL].(2024-09-14)[2024-11-10].https://liu-cheng-ao.blog.uoj.ac/blog/9260

posted on 2024-11-10 21:38  zhangtj  阅读(9)  评论(0编辑  收藏  举报