2-SAT

将每个限制条件改写为「若 \(A\)\(B\)」的形式。从 \(A\rightarrow B\) 连一条有向边,跑 \(\rm SCC\) 缩点。若 \(i\)\(i'\) 在同一联通块,则无解。否则有解。

具体的方案是,令每个点 \(c\)(所在联通块)小的为真。

P6378 [PA2010] Riddle

前后缀优化建图,记 \(pre_{a_i}\) 表示 \(a_i\) 点在其所在部分的前面的点是否有关键点,连边如下:

  • \(a_i\rightarrow pre_{a_i}\),$ pre_{a_i}'\rightarrow a_i'$
  • \(pre_{a_{i-1}}\rightarrow pre_{a_o}\)\(pre'_{a_i}\rightarrow pre'_{a_{i-1}}\)]
  • \(pre_{a_{i-1}}\rightarrow a'_i\)\(a_i\rightarrow pre'_{a_{i-1}}\)

[ARC069F] Flags

二分答案 \(mid\),那么 \(i\) 点不能和 \([i-mid,i-1]\)\([i+1,i+mid]\) 共存。但是 2-sat 是「若 \(A\)\(B\)」的形式。于是可以将区间上的点变成虚拟点,然后每个虚拟点向自己的真实点的反向节点连边,就变成了「若 \(A\)\(B\)」的形式。

建一棵线段树即可。

posted @ 2024-09-11 11:42  xishanmeigao  阅读(22)  评论(0)    收藏  举报