题解: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]\) 中的,转移分别是:

\[f(i, j, 0) \leftarrow f(k, j - (i - L_i + 1), 1) \]

\[f(i, j, 0) \leftarrow f(k, j - (i - k), 1) \]

左边是 \(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)\) 的解法。

posted @ 2021-10-06 21:00  AxDea  阅读(47)  评论(0编辑  收藏  举报