将每个限制条件改写为「若 \(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
线段树优化建图。只不过本题的连边不是「若 \(A\) 则 \(B\)」,而是「若 \(A\) 则 不 \(B\)」。
建一棵线段树即可,叶子节点向原节点的反节点连边。
标签:pre,连边,建图,SAT,节点,rightarrow From: https://www.cnblogs.com/xishanmeigao/p/18407985