【题解】 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\),发现按照下面方法选出的点集的最小权值和就是答案。

  1. \(p_i\)\(\lnot p_i\)之中必须且至少选一个。\(0\)\(1\)之间也一样。

  2. 与被选点之间有边相连的点必须被选。(即每次必须选择一个完整的连通块)

然后就是用并查集维护连通块了……

猜你喜欢

转载自www.cnblogs.com/ztc03/p/12364652.html