CF997C Sky Full of Stars
考虑容斥,假设有 i 行 j 列全部同色的方案数为 fi,j,那么最终答案就是:
i+j>0∑(in)(jn)⋅fi,j⋅(−1)i+j+1
考虑表示 fi,j,有:
fi,j=⎩⎪⎪⎨⎪⎪⎧3j+n(n−j)3i+n(n−i)3(n−i)(n−j)+1i=0j=0i=0,j=0
发现 i=0 与 j=0 的情况非常特殊,考虑特殊计算:
i=1∑nj=1∑n(in)(jn)⋅fi,j⋅(−1)i+j+1+2i=1∑n(in)⋅fi,0⋅(−1)i+1
两个部分分别化简。先看前一半:
======i=1∑nj=1∑n(in)(jn)⋅fi,j⋅(−1)i+j+1i=1∑nj=1∑n(in)(jn)⋅3(n−i)(n−j)+1⋅(−1)i+j+1i=1∑nj=1∑n(in)(jn)⋅3n2−ni−nj+ij+1⋅(−1)i+j+13n2+1⋅(−1)i=1∑nj=1∑n(in)(jn)⋅3−ni⋅3−nj⋅3ij⋅(−1)i⋅(−1)j3n2+1⋅(−1)i=1∑n(in)⋅3−ni⋅(−1)ij=1∑n(jn)⋅3(−n+i)j⋅(−1)j3n2+1⋅(−1)i=1∑n(in)⋅3−ni⋅(−1)ij=1∑n(jn)⋅(−3−n+i)j⋅1n−j3n2+1⋅(−1)i=1∑n(in)⋅3−ni⋅(−1)i⋅((−3−n+i+1)n−1)
后半部分可以直接算,然后就做完了。
CF1728G Illumination
m 只有 16,考虑容斥。先考虑不动态加点如何解决。
我们令 f(S) 表示不覆盖到关键点集合 S 的点灯方案数,则有:
ans=S⊂U∑f(S)×(−1)∣S∣
这样计算出的 ans 是覆盖了除最左与最右两点之外的所有点但不覆盖最左最右点的方案数,只要加上 −∞ 与 −∞ 两个点即可。
我们考虑如何计算 f(S)。不覆盖到关键点集合 S 等价于用 S 中的位置将数轴划分为 ∣S∣+1 个区间,每个区间都不覆盖边界。我们可以 O(nm2) 预处理出 g(l,r) 表示 [pl,pr] 区间内的电灯都不覆盖 pl 与 pr 关键点的方案数。 则有:
f(S)=i=1∏∣S∣−1g(Si,Si+1)
所以容斥复杂度为 O(2mm)。
g 数组的处理是平凡的。枚举所有灯 i,并枚举所有包含它的区间 j。令灯位置为 ai,区间左右端点分别为 lj 与 rj。则这盏灯的 power 范围是 [0,min{ai−lj,rj−ai})。给 j 的 g 乘上它的贡献即可。复杂度 O(nm2)。
至此,我们 O(nm2)−O(2mm) 解决了静态问题。
考虑动态加灯。这盏灯对 g 的修改是可以 O(m2) 解决的。但是如果每次更改后重新进行容斥,那么复杂度是不能接受的。于是一种方式是在动态加点前算出每个 g 值对答案的贡献,这样单次询问是 O(m2) 的,可以通过,复杂度 O(nm2)−O(2mm)−O(qm2)。
但是有另一种更为简介的方法可以在更优时间复杂度内(单次询问相同,预处理更优)解决此问题。
我们观察到每个容斥状态的值是所有子段值的连乘且所有子段不交且覆盖了区间 (−∞,+∞),所以可以将容斥写成 dp 状物,即:
dpi=j=1∑i−1(−1)×dpj×g(j,i)
那么容斥系数在每加一段后都会 ×−1,最后就是 (−1)∣S∣。而 ∏g 也在 dp 转移中进行了计算。最后答案为 dpm+1。这样单次 dp 复杂度是 O(m2),可以通过此题。