首先这道题应该不难发现 k 具有单调性,可以二分答案。然后每个数有分配到 a 和 b 两种可能,可以想到 2-SAT。二维偏序可以考虑数据结构或 cdq 分治,我选择使用 cdq 分治。
首先 u 和 v 不能放在同一个集合,直接连边就行了。
对于 j<i 且 v_j\le v_i-k,即对于所有 j<i 且 v_j+k\le v_i 的点,把 j 的 a 连一条边到 i 的 b(逆否命题同理,把 i 的 a 连向 j 的 b)。
然后用 cdq 分治连边。假如我们现在在考虑区间 l 到 r,那么只要考虑前一半对后一半的连边就行了,这里可以考虑前缀优化连边。先对区间排序(前一半按 v_i+k,后一半按 v_i),设 p_i 表示排序后的前 i 个数里,有没有前一半的数被选进 a 了(即接下来不能选后一半的数进 a),然后按顺序考虑连边:
如果当前考虑到的第 i 个数是前一半的,则把 i 的 a 和 p_i 的 1 连,p_i 的 0 和 i 的 b 连,p_{i-1} 的 1 和 p_i 的 1 连,p_i 的 0 和 p_{i-1} 的 0 连。
否则(属于后一半),把 p_{i-1} 的 1 和 i 的 b 连,i 的 a 和 p_{i-1} 的 0 连,然后因为后一半的数不影响前缀状态,所以 p_i 和 p_{i-1} 的状态是一样的,直接把 p_i 和 p_{i-1} 双向互连即可。