二分 + 2-SAT + cdq优化建图
首先看到 $k$ 的限制, $k$ 越大越不可能合法,可以二分。
然后考虑一个划分中一个数非 $a$ 即 $b$ ,可以用 2-SAT 判定。
然后发现连边稍微有点多,但是连边的时候可以一下子连某个区间,考虑可以数据结构优化一下。
再细看一下,前两个条件都是偏序的形式,所以想到 cdq 分治。
第一维按原数组顺序即可,分治下去,用归并的方式可以将第二维排序。然后每次处理从右区间连向左区间的边。
可以发现,右区间对左区间的限制条件是一个前缀或后缀,可以考虑直接连出一条链然后把条件从链中间插进去。
假设当前分治区间 $[L,R]$ 。
对于左区间 $[L,mid]$ 的那条链可以这样建:

那么可以发现,对于形如“若 $i$ 进了 $a$ (或 $b$ ),则某个前缀中的点都进了 $b$ (或 $a$ )。” 的条件都有唯一对应的点。所以直接双指针找到对应点,模拟条件把区间 $[mid+1,R]$ 的点往链上面连边就可以了。在代码中有详细说明。
然后直接跑 tarjan 判定 2-SAT 即可。
值得一提,跑完 tarjan 可以只用判定原先的点及对立点是否在同一个强连通分量中即可,因为 cdq 分治附加上的点与原先的点直接相关,不可能在原先的点符合条件的基础上这些点上出现矛盾。
不难发现,连出来的边是 $O(n\log n)$ 的。因此总复杂度 $O(n\log n\log V)$ 。
代码:
1 | #include<cstdio> |

