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