【题解】 CF1290C Prefix Enlightenment
题目大意:
有\(n\)盏灯排成一排,还有\(k\)个开关,第\(i\)个开关可以使集合\(A_i\)里的灯改变状态(开\(\to\)关,关\(\to\)开),且每盏灯最多由两个开关控制。
给出所有灯的初始状态,对于每个满足\(1\leqslant i\leqslant n\)的\(i\),计算使前\(i\)个灯均打开,至少使用开关的数量。
观察发现,每个开关只有两个状态:使用和不使用。设\(p_i\)表示使用第\(i\)个开关。
若一盏灯不受任何开关控制,则直接跳过。
若一盏灯受一个开关控制,设其为\(a\)
- 如果\(s_i=1\),则\(p_a\leftrightarrow0,\lnot p_a\leftrightarrow1\)
- 如果\(s_i=0\),则\(p_a\leftrightarrow1,\lnot p_a\leftrightarrow0\)
若一盏灯受两个开关控制,设其为\(a,b\)
- 如果\(s_i=1\),则\(p_a\leftrightarrow p_b,\lnot p_a\leftrightarrow \lnot p_b\)
- 如果\(s_i=0\),则\(p_a\leftrightarrow\lnot p_b,\lnot p_a\leftrightarrow p_b\)
按照上面的方法对\(0,1,p_i,\lnot p_i\)连边,并将四者的权值分别赋为\(\infty,0,1,0\),发现按照下面方法选出的点集的最小权值和就是答案。
-
\(p_i\)和\(\lnot p_i\)之中必须且至少选一个。\(0\)和\(1\)之间也一样。
-
与被选点之间有边相连的点必须被选。(即每次必须选择一个完整的连通块)
然后就是用并查集维护连通块了……
Please not contact lydsy2012@163.com!