n≤1000 直接并查集即可。令
i 表示在点
i 且此时树蛙颜色为绿色,
i+n 表示在点
i 且此时的树蛙颜色为棕色,如果原平面上
i 能跳到
j 则
i 和
j+n 合并,
j 和
i+n 合并,显然只要最后
i 和
i+n 在一个集合中就是合法情况。
考虑
n≤105。我们有以下两个结论:
- 如果一个点 i 和 i+n 在一个集合中,则与 i 连通的所有点 j 都一定合法,即 j 和 j+n 在一个集合中。
- 证明很简单,令原平面上 j 能通过 d 步跳到 i,如果 d≡0(mod2) 则 j→i→i+n→j+n 是一条可行的方案,否则 j→i+n→i→j+n 是一条可行方案。
- 如果有一个集合 S 满足 S 中的点在原平面上能互相到达,且 ∣S∣≥3,则 S 中所有点均可行。
- 证明:如果 i∈S,那么可以找到 j1,j2 满足 j1∈S,j2∈S,j1=j2,j1=i,j2=i,此时在原平面 i→j1→j2→i 即为一种可行的方案。因为 ∣S∣≥3,所以一定能找到 j1,j2。
把平面分成若干个
B×B 的矩形,满足一个
B×B 矩形内的点均可以互相到达,对于一个矩形,令矩形内的这些点集合为
S,那么如果
∣S∣≥3,就直接
∀i∈S,
i 和
i+n 合并即可。
取
B=2r,令
Si,j={(xk,yk)∣iB≤xk<(i+1)B,jB≤yk<(j+1)B},此时一个
Si,j 内部的任意两点距离
≤22r,同时还有一个性质,对于
Si,j,只有满足
∣i−i′∣≤2,∣j−j′∣≤2 的
Si′,j′ 中的点有可能直接跳到
Si,j,即以
(i,j) 为中心边长
5 的正方形。
证明:对于
Si,j,如果
∣x−i′∣>2 或
∣y−j′∣>2 则
Si,j 中一点到
Si′,j′ 中一点距离至少为
r+1。
枚举
Si,j,如果
∣Si,j∣≥3 直接判合法,否则直接暴力向其四周
24 个
Si′,j′ 中所有点判断能否到达即可。
加上并查集的
logn,这样做是
O(48nlogn) 的。
证明:对于一个点
(a,b)∈Si,j,只有其周围
24 个
Si′,j′ 中的点可能试图与其进行合并,由于
∣Si′,j′∣≤2(否则会直接判掉),因此每个点被其他点访问的总数不超过
48。
显然
Si,j 的数量是
1018 级别的,但是非空的数量不超过
n,于是把非空的
Si,j 离散化之后
(i,j) 和编号对应关系用 map 存起来,做完了。