题目大意
有
m
种物品,
70分算法
正难则反。
考虑用所有方案数减去不合法的方案数。所有方案数显然是
2n−1
。
接下来我们枚举少了哪些元素作为不合法的方案,然后利用容斥原理,枚举它的子集得到至少少了这些元素的箱子个数
cnt
,少了奇数个则减去
2cnt−1
,否则加上。
时间复杂度 O(3m)
100分算法
我觉得满分算法比较神。它是利用分治把所有的
cnt
一齐算出来。
考虑我们现在要算出
[l,r)
区间的答案。
[l,mid)
区间二进制首位都为
0
,
而对应位置上右区间只是比左区间多了开头的一个
后记
这种分治策略有印象不是第一次见了,和 FFT 也有点异曲同工之妙,记住它吧。