联合省选 2025 D2T1 题解

题目链接

完全跟着特殊性质走的,就没有想偏过。

先看特殊性质 A,所有点的时间都一样,然后容易发现一定存在一种方案使得每个点只朝它的目标去移动,所以就做完了;再看特殊性质 B,每个点到目标之间没有其他点,但是时间会不一样,此时可以考虑按照时间从小到大排序,然后每个点依次移到目标即可。

再看特殊性质 C,结合 A B 得到启发:
1. 按照时间从小到大排序。
2. 一定存在一种方案使得每个点只朝它的目标去移动。

关于启发 2,读者可以自行思考一下,如果每个点的目标可能在左边也可能在右边,那么仍然成立吗?

这是显然的,不然 b 就不会递增了。所以正解做法就是按照时间排序,然后模拟即可。

重点在于模拟方法,发现箱子的移动会导致连锁反应,最后得到的序列类似等差数列,于是可以把 ai 减去 i,然后线段树区间 cover,但是笔者选择了更为简单的方法。

考虑按照时间直接用 ``set`` 维护所有已经到目标的点,每次取出时间最小的点 x,我们先钦定目标都在右侧(即特殊性质 C),那么先看 x 当前的位置,这是很好做的,只需要找出 x 左侧第一个被主动移动过的点 i。(注意我们认为被其他箱子推动的箱子是被动移动)那么 x 现在的位置就是 max(bi+xi,ax),设这个为 loc

接下来我们发现 x 右侧会有一些在之前就被 x 推动的箱子,这些箱子 y 一定满足 ay<loc+yx,移项可得 ayy<locx,发现左边单调不降,于是直接二分。

之前没被 x 推动的箱子这一轮也可能会被推动,但是它们一定是连续的一块,具体的,如果箱子 y 会被推动,那么满足 ay<bx+yx,移项之后仍然可以二分。得到最后一个在本轮会被推动的箱子后,就是一个等差数列求和公式,非常好算。

另外注意一种特殊情况,在 bx 前有一个点 y 已经被移到了 by,那么 y 及后面的点不需要考虑,至于 y 会不会被 x 推动,显然是不会的,不然 b 就无法递增了。

于是特殊性质 C 也结束了,正解就是对于目标在左边对称处理。这里读者可能会有疑问:难道向左和向右的不会相交吗,还是那句话,显然是不会的,不然 b 就无法递增了。于是我们在 O(nlogn) 的时间内解决了这道题。

希望写线段树的会被卡成 TLE 让我排名靠前一点(

posted @   Xy_top  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示