题解:Nonnil
Problem Statement
求满足以下条件的正整数列 \(A = (A_1, A_2, \cdots , A_N)\) 的个数:
- \(1\le A_i\le K\)
- 对于所有的 \(i\ (1\le i\le M)\) 存在一个位置 \(j\ (1\le j\le N)\) 使得 \(L_i\le A_j\le R_i\) 。
Constraints
- \(1\le N\le 10 ^ 9\)
- \(1\le K \le 1500\)
- \(1\le M \le \min\left\{2\times 10 ^ 5 , \dfrac{K(K + 1)}{2}\right\}\)
- \(1\le L_i \le R_i\le K\)
- 对于所有 \(i\neq j\) ,有 \((L_i, R_i) \neq (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\) 时的合法的最右侧的左端点。
那么有两种转移,一种是对于原先最右端点 \(k\in [0, L_i - 1]\) 中,另一种是对于最右端点 \(k\in [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_{k\le \min\{i, j\}} f(i - k, j - k, l)\) 。
然后就得到了一个 \(\mathcal O (K ^ 2)\) 的解法。