QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: jiangly

Posted at: 2025-12-14 07:10:57

Last updated: 2025-12-14 07:11:09

Back to Problem

题解

先考虑如何判断能否从 $(1,1)$ 到达 $(n,m)$。下面给出了几种无法到达的情况:

  1. 存在一行被阻断,即 $\min\{a_i\}+\max\{b_j\}< 0$。
  2. 存在一列被阻断,即 $\max\{a_i\}+\min\{b_j\}< 0$。
  3. 起点被阻断,即存在 $1\le x\le n,1\le y\le m$ 使得 $a_x+b_j< 0\pod{1\le j\le y}$ 且 $a_i+b_y< 0\pod{1\le i\le x}$。
  4. 终点被阻断,即存在 $1\le x\le n,1\le y\le m$ 使得 $a_x+b_j< 0\pod{y\le j\le m}$ 且 $a_i+b_y< 0\pod{x\le i\le n}$。

事实上,这同时也是 $(1,1)$ 无法到达 $(n,m)$ 的必要条件 (即四个条件都不满足时一定能到达)。

证明 称 $a_i+b_j\ge 0$ 的点 $(i,j)$ 为好点,其余点为坏点。条件 1 不满足意味着存在一列都是好点,不妨设为列 $c$。条件 2 不满足意味着存在一行都是好点,不妨设为行 $r$。只需证明 $(1,1)$ 能到达 $(r,c)$ 且 $(r,c)$ 能到达 $(n,m)$ 即可。由于过程类似,以 $(1,1)$ 到 $(r,c)$ 为例。 如果 $r=1$ 或 $c=1$ 则得证。否则,一定存在一行 $r'< r$ 使得 $(r',j)\pod{1\le j\le c}$ 都是好点或存在一列 $c'< c$ 使得 $(i,c')\pod{1\le i\le r}$ 都是好点 (否则可以发现条件 3 成立)。于是就转化到了 $r+c$ 更小的情况,重复此过程直到 $r=1$ 或 $c=1$ 即可。

接下来考虑如何计算答案。条件 3, 4 会直接去掉一些起点和终点。剩下的点中,条件 1, 2 为每个起点限定了一个区间,且区间的两端点都是单调的,可以直接用指针维护。于是只需要解决条件 3, 4 即可。

以条件 3 为例。枚举 $x$,找到最小的 $j$ 使得 $a_x+b_j\ge 0$ (排序后用一个指针扫),那么只需要考虑所有小于 $j$ 的 $y$ 中 $b_j$ 最小的一个。接着找到最大的 $i < x$ 使得 $a_i+b_y\le 0$ (单调栈 + 二分),那么从 $i+1$ 到 $x$ 的所有起点都不可能到达任何终点 (用差分记录即可)。

时间复杂度 $O(n\log n+m)$。

Comments

No comments yet.