[ARC171B] Chmax
Solution
首先可以发现相同 \(a_{i}\) 的元素可以形成一条链。
问题很容易转化为:给定若干线段 \([l_{i}, r_{i}]\),要求 \(i\) 能连向 \(j\) 当且仅当 \(l_{j} < r_{i}\),求生成环集的数量。
容易发现两个点之间至少有一条边,当且仅当两线段不交时,左侧线段无法连向右侧线段。
感觉直接莽不舒服,转成补图就舒服多了。
超集反演。记 \(U\) 表示补图边全集,\(w(S)\) 表示生成图边集 \(\cap U = S\) 的方案数,\(W(S)\) 表示生成图边集 \(\cap U \supseteq S\) 的方案数。显然有 \(W(S) = \sum\limits_{S \subseteq T}w(T) \iff w(S) = \sum\limits_{S \subseteq T}(-1)^{|T| - |S|}W(T)\)。于是答案为:
\[\begin{aligned} w(\emptyset) = \sum\limits_{S}(-1)^{|S|}W(S) \\ \end{aligned} \]\(W(S)\) 可以 DP 求出。将线段按左端点排序并依次编号(以下直接称线段为点了),记 \(f_{i, j}\) 表示考虑前 \(i\) 个点,共连了 \(j\) 条不合法边的方案数。现在考虑 \(f_{i - 1} \to f_{i}\) 的转移,假设当前点 \(i\) 的入度为 \(c\),则:
\[\begin{aligned} f_{i, j} &\leftarrow f_{i - 1, j} \\ f_{i, j + 1} &\leftarrow (c - j)f_{i - 1, j} \\ \end{aligned} \]正确性在于:如果 \(i \to j\),\(k > j\),则 \(i \to k\)。
此做法其实是将原问题形式化成了该问题:给定一个非负不降整数序列 \(a_{1}, \dots, a_{n}\)(即入度序列),对 \(i = 1, \dots, n\) 求选取 \(i\) 个元素的带权方案数,权值定义为 \(\prod\limits_{j = 0}^{i - 1}(c_{j} - j)\),其中 \(c\) 序列是你选取的数。这个我还不会更优复杂度。code ARC171B - \(O(n^{2})\)
回到第二步:|考虑给每个右端点匹配一个左端点,如果一个位置是左端点则 ++cnt
,如果一个位置是右端点则 ans *= cnt, --cnt
。