联合省选 2025 D2T1 题解

题目链接

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2025-03-03 01:15  Xy_top  阅读(29)  评论(0)    收藏  举报