【搬自Spoj-SOPARADE】第四次忍者大战 题解

题目大意

  现在要将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就行啦!