Luogu P11833 省选联考 2025 推箱子 题解 [ 蓝 ] [ 线段树上二分 ]
推箱子:你怎么知道我今年省选场上只切了这一题???????
比前两年省选 D2T1 简单多了,场上 20min 内出思路,但代码打了比较久。
思路
首先这题有个很显然的贪心,我们把箱子以时间为关键字进行排序,那么结束时间早的箱子就一定先被移动。
继续考虑箱子移动后能有什么影响,不难发现,一个箱子向右移动之后,在移动路线上的箱子必须都往右移动。具体地,第 \(i\) 个路径上的箱子最后的位置是 \(p+i\),其中 \(p\) 为这个箱子移动到的位置。向左也是同理,最后位置是 \(p-i\)。
同时,因为 \(a,b\) 单调递增,所以一定不会有箱子要跨越别的箱子,同时也不会出现把一堆箱子向右移动之后最后把箱子推回来的情况。
所以我们可以尝试写出一个 \(O(n^2)\) 的暴力,每次移动一个箱子到终点的时候,递归移动左边或右边的第一个箱子,直到不需要移动,可以通过第二个和第三个大样例,可见大样例有多水。
考虑进一步优化这个做法,我们可以利用线段树来处理一整段箱子的移动。注意到箱子间的相对位置并不会改变,所以维护一个序列,存每个箱子的位置,移动一段箱子的时候,二分找到最后一个要移动的箱子的编号,然后进行区间覆盖操作即可。
具体地,我们二分右边最后一个 $pos<p+i-x $ 的箱子(\(p\) 表示最后移动到的位置,\(x\) 表示当前移动到目标位置的箱子,\(i\) 表示二分的箱子,\(pos\) 表示二分的这个箱子的位置),然后区间覆盖,维护两个值:\(p,x\),则有标记的时候某个位置 \(i\) 就被覆盖成了 \(p+i-x\)。其实就相当于增加一个等差数列。
向左边移动也是同理,不再赘述。
时间复杂度 \(O(n \log^2 n)\),考场上忘记线段树上二分咋写了,就没优化到单 log,实际这个应该可以用线段树上二分优化到 \(O(n\log n)\) 的。但是双 log 的做法我考场机子上卡满了也只跑了 4s 啊,正式评测估计卡不掉吧。
代码
等公布代码了再贴上去。

浙公网安备 33010602011771号