【搬自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就行啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值