Problem Statement
求满足以下条件的正整数列 (A = (A_1, A_2, cdots , A_N)) 的个数:
- (1le A_ile K)
- 对于所有的 (i (1le ile M)) 存在一个位置 (j (1le jle N)) 使得 (L_ile A_jle R_i) 。
Constraints
- (1le Nle 10 ^ 9)
- (1le K le 1500)
- (1le M le minleft{2 imes 10 ^ 5 , dfrac{K(K + 1)}{2} ight})
- (1le L_i le R_ile K)
- 对于所有 (i eq j) ,有 ((L_i, R_i) eq (L_j, R_j))
- 所有输入的数均为整数。
solution
首先考虑只有一对 ((L_i, R_i)) 时候的方案数,简单容斥一下为 (K ^ N - (K - (R_i - L_i)) ^ N) 。
那考虑整个题都用容斥定理来做,多个命题都成立相当于在值域上,这些 ([L_i, R_i]) 并起来后没有一个数字出现在其中。
直接做是 (mathcal O (2 ^ M)) 的。
考虑优化暴力,发现有些线段 ([L_i, R_i]) 包含了其他小线段,这些线段当然是没有用的。
然后限制的个数变成了 (mathcal O (K)) 了,算上上面的东西,时间复杂度为 (mathcal O (2 ^ K)) 。
发现一共只有 (K) 个 ((K - x) ^ N) ,所以考虑算这些东西的容斥系数。
也就是统计长度并大小为 (i) 的线段集合中集合大小为奇数的个数和偶数的个数。
那么设 (f(i, j, k)) 表示以 (i) 为最右方的端点,线段并大小为 (j) ,奇偶性为 (k) 的线段集合个数。
这个状态是基于将线段按右端点排序从左往右加入设出的。
设线段为 ([L_i, i]) ,其中 (L_i) 表示右端点为 (i) 时的合法的最右侧的左端点。
那么有两种转移,一种是对于原先最右端点 (kin [0, L_i - 1]) 中,另一种是对于最右端点 (kin [L_i, i]) 中的,转移分别是:
左边是 (1) 的时候同理。
可以发现这个东西是 (mathcal O (K ^ 3)) 的。
第一个转移的第二项是不变的,所以维护 (pre(i, j, l) = sum_{k le i} f(k, j, l)) 即可。
第二个转移的第一项和第二项的差是不变的,所以维护 (dia(i, j, l) = sum_{kle min{i, j}} f(i - k, j - k, l)) 。
然后就得到了一个 (mathcal O (K ^ 2)) 的解法。