CF1728G题解

看到 \(m\) 很小,可以想到状压或容斥。

状压比较困难,考虑容斥。

枚举没有被照亮的点的集合,记为 \(S\)\(f(S)\) 为其方案数。

\[ans=\sum_{S}(-1)^{|S|}f(S) \]

考虑计算 \(f(S)\)。发现 \(S\) 里的点会把原区间划分为 \(|S|+1\) 个段,每盏灯必然落在某个区间内,那么它必定不能越过区间的两个端点,我们可以每个区间单独考虑,记 \(g(l,r)\) 表示第 \(l\) 个点到第 \(r\) 个点之间的灯都不越过 \(l,r\) 的方案数,计算 \(g(l,r)\) 只需将落在这个区间内的灯的方案数乘起来,复杂度 \(\mathcal{O}(nm^2)\)

最后 \(f(S)=\prod_{i}g(S_i,S_{i+1})\),复杂度 \(\mathcal{O}(m2^m)\)

这是静态做法,考虑修改,发现 \(g\) 是可以 \(m^2\) 暴力改的,但是重新计算 \(f\) 的复杂度是 \(\mathcal{O}(qm2^m)\),显然无法接受。

这里有两种处理方法,一种是预处理时对于每个 \(g(l,r)\) 统计其对 \(f\) 的贡献,修改的时候去除原贡献再添上新贡献。

但有一个复杂度更优的做法,因为这里容斥系数的计算是子段连乘且子段不交,可以转化为 \(dp\)

\(dp_{i,j}\) 表示 \(S\)\(i\) 位,最后一位 \(1\)\(j\) 的贡献。

\[dp_{i,j}=\sum_{k}(-1)\times dp_{i-1,k} \times g(k,j) \]

posted on 2022-11-06 17:19  cool_tyl  阅读(22)  评论(0)    收藏  举报