题目大意
现在要将n个忍者排成一行,每个忍者有一个标识a[i](1<=a[i]<=4),相邻两个忍者的标识的差的绝对值一定要大于等于2,同时,有m组形如”b[1],b[2],b[3]…b[k]”的约束条件,表示这些忍者的标识各不相同。
现在我们想知道,给出n和所有约束条件后,是否存在一种a序列,使得a满足这些条件。
n,m<=100000
首先
k大于4则无解。
【40%】n,m<=16
我们考虑第一个位选什么,发现选完之后,后面每个位最多只有两种选择。所以2^16的算法过掉40分。
【100%】n,m<=10^5
我们发现奇数位只能选1和2、偶数位只能选3和4。(如果奇数位选3和4,相当于把12和34反了过来,所以是一样的情况。)
于是惊奇的发现可以2-SAT。先把每个位置拆成两个点,奇数位的两个点表示1和2,偶数位的两个点表示3和4。
第一种限制:相邻两个位置差>=2:奇数位的2向相邻的4连边;偶数位的3向相邻的1连边。
第二种限制:给定的m个条件:当条件中的两个数同为奇数时,各自的1向对方的2连边,各自的2向对方的1连边;同为偶数时同理。一奇一偶不用管。
连完边跑2-SAT就行啦!