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)
\]
浙公网安备 33010602011771号