Luogu P11833 省选联考 2025 推箱子 题解 [ 蓝 ] [ 线段树上二分 ]

推箱子:你怎么知道我今年省选场上只切了这一题???????

比前两年省选 D2T1 简单多了,场上 20min 内出思路,但代码打了比较久。

思路

首先这题有个很显然的贪心,我们把箱子以时间为关键字进行排序,那么结束时间早的箱子就一定先被移动。

继续考虑箱子移动后能有什么影响,不难发现,一个箱子向右移动之后,在移动路线上的箱子必须都往右移动。具体地,第 i 个路径上的箱子最后的位置是 p+i,其中 p 为这个箱子移动到的位置。向左也是同理,最后位置是 pi

同时,因为 a,b 单调递增,所以一定不会有箱子要跨越别的箱子,同时也不会出现把一堆箱子向右移动之后最后把箱子推回来的情况。

所以我们可以尝试写出一个 O(n2) 的暴力,每次移动一个箱子到终点的时候,递归移动左边或右边的第一个箱子,直到不需要移动,可以通过第二个和第三个大样例,可见大样例有多水。

考虑进一步优化这个做法,我们可以利用线段树来处理一整段箱子的移动。注意到箱子间的相对位置并不会改变,所以维护一个序列,存每个箱子的位置,移动一段箱子的时候,二分找到最后一个要移动的箱子的编号,然后进行区间覆盖操作即可。

具体地,我们二分右边最后一个 pos<p+ix 的箱子(p 表示最后移动到的位置,x 表示当前移动到目标位置的箱子,i 表示二分的箱子,pos 表示二分的这个箱子的位置),然后区间覆盖,维护两个值:p,x,则有标记的时候某个位置 i 就被覆盖成了 p+ix。其实就相当于增加一个等差数列。

向左边移动也是同理,不再赘述。

时间复杂度 O(nlog2n),考场上忘记线段树上二分咋写了,就没优化到单 log,实际这个应该可以用线段树上二分优化到 O(nlogn) 的。但是双 log 的做法我考场机子上卡满了也只跑了 4s 啊,正式评测估计卡不掉吧。

代码

等公布代码了再贴上去。

posted @   KS_Fszha  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示