把有序数对看成坐标,扔到平面直角坐标系上研究。下面记点
A(a1,a2),B(b1,b2)。不加说明时,我们均指第一象限。记值域为
V。
发现点
P(x,y) 可以变成形如
(i,⌊xyi⌋),(⌊yxi⌋,i),i∈Z 的点。不过还是有向下取整,不好描述。
那么倒过来看,对于
Q(p,q),能够到达它的
P 的集合是什么。
设直线
OP:y=kx,如果
P 能到达
Q,则
OP 必须穿过以
Q 为左下角、边长为
1 的正方形,穿过是指
OP 在正方形内的部分的长度
>0。
设
Qu(p,q+1),Qr(p+1,q),则只要
OP 在
∠QrOQu 内部(不包括
OQu,OQr),其就会穿过这个正方形。
那么就有
k∈(kOQr,kOQu),即能够到达
Q(p,q) 的
P∈{(x,y)∣p+1q<xy<pq+1}。
设
l1=b1+1b2,r1=b1b2+1,我们就可以算出经过
≤1 次操作到达
B 的点的集合为
S1={(x,y)∣l1<xy<r1}。
同理,设
l2=min{x+1y∣(x,y)∈S1},r2=max{xy+1∣(x,y)∈S1},则经过
≤2 次操作到达
B 的点的集合为
S2={(x,y)∣l2<xy<r2}。
更一般地,对于
t≥2,设
lt=min{x+1y∣(x,y)∈St−1},rt=max{xy+1∣(x,y)∈St−1},则经过
≤t 次操作到达
B 的点的集合为
St={(x,y)∣lt<xy<rt}。
先来研究已知
lt−1,rt−1 如何求
lt,rt。下面只讨论
lt,
rt 是类似的。
问题相当于求最小的
x+1y,满足
lt−1<xy<rt−1。考虑到
x+1y=yx+y11,即我们要
y 尽量小
yx 尽量大。在
y 最小的同时取
x 最大即可,可以用反证法和一些缩放证明。
同理,求
rt 时找满足
x 最小的最大
y 即可。
找到这样的
x,y 可以在 SBT 上二分实现。
接下来就是要求第一次满足
A∈St 的
t。打表发现
lt,rt 在迭代若干轮之后就不变了,所以可以暴力求每一轮的
lt,rt 是多少。考虑到
l,r 在 SBT 上移动的过程,得到
x=1 或
y=1 后就不会变了,所以迭代次数是
O(logV) 的。
注意有点在坐标轴、
y=x 上以及不在
y=x 同一侧的时候判无解。可以用关于
y=x 对称简化讨论。
总的复杂度是
O(Tlog2V)。