题解 AT3955 【[AGC023D] Go Home】

· · 题解

如果 X_1 < S < X_N,考虑第 1 栋楼和第 N 栋楼。

如果 P_1 \ge P_N,即第 1 栋楼中的人数大于等于第 N 栋楼中的人数,则班车一定会先去第 1 栋楼。证明:

所以说不管怎么样都会先前往第 1 栋楼,然后就可以一路向右径直跑到第 N 栋楼。

这就意味着,第 N 栋楼中内的员工的回家时间,一定等于第 1 栋楼的回家时间,加上 X_N - X_1

也就是说,第 N 栋楼中的员工,其实是和第 1 栋楼中的员工站在同一条线上的。第 1 栋楼的员工想投什么票,他们也一定会跟着投。所以说这第 N 栋楼的员工其实和第 1 栋楼的员工没什么区别,暂时(在第 1 栋楼的员工回家之前)让他们搬家到第 1 栋楼也对运行路径没有影响。

所以说,如果让 P_1 \gets P_1 + P_N,然后删去第 N 栋楼,计算这种情况下的到达第 1 栋楼的时间,加上 X_N - X_1 就是答案。

如果 P_1 < P_N,那么以上结论的方向反过来即可。

这样递归下去,直到不满足 X_1 < S < X_N 为止,那样的话就可以直接计算答案了。

时间复杂度 \mathcal O (N),评测链接。