Description
题目链接:Codeforces 724C
有一个 $n\times m$ 的矩形,四周有围墙围起来,其左上角和右下角的坐标分别为 $(0,0)$ 和 $(n,m)$。从 $(0,0)$ 开始以 $\sqrt 2$ 个单位每秒的速度向 $(1,1)$ 的方向发射一束光线,每次遇到墙都正常反射(符合物理的反射),光线射到顶点会被吸收。在这个矩形内有 $k$ 个点,坐标分别为 $(x_i,y_i)$,求每个点第一次被光线经过的时刻。
数据范围:$2\le n,m\le 10^5$,$1\le k\le 10^5$,$1\le x_i<n$,$1\le y_i<m$
Solution
对于这类矩形内上的反射问题,我们可以将矩形无限展开,那么相当于我们把点按照矩形边界对称,光线也就边成了一条直线。
我们考虑对称后的点的坐标是什么。如果原来的坐标为 $(x,y)$,那么按照第 $k$ 条横轴展开的坐标为 $(x,2km-y)$,按照第 $k$ 条纵轴展开的左边为 $(kn-x,y)$。因此,如果我们沿着若干条轴展开后,坐标一定可以写成 $(k_1n\pm x,k_2m\pm y)$ 的形式。
由于我们知道了展开后的坐标,那么有如下方程:
发现这是一个丢番图方程,我们可以直接解出 $(k_1,k_2)$ 的通解。
但是,题目中规定光线在矩形顶点位置会被吸收,那么我们就要保证坐标的绝对值小于等于 $\operatorname{lcm}(n,m)$,否则光线一定会经过 $\operatorname{lcm}(n,m)$ 这个点而被吸收。
因此,我们对 $4$ 种情况分别求解,找到一组解使得 $k_1n\pm x$ 的值尽量小且大于 $0$。形象地说,就是使得 $k_1n\pm x$ 最小并满足 $0<k_1n\pm x<\operatorname{lcm}(n,m)$。
这个最小的符合条件的解就是答案。
时间复杂度:$O(k\log n)$
Code
1 |
|