考虑对于每个合法的序列 \(b\) 对应出唯一序列的 \(a\):
\(a_i\) 为所有对应区间 \([l_j, r_j]\) 包含 \(i\) 的 \(b_j\) 的最大值,若没有则为 \(1\)。这样填完之后所有 \(a_i\) 均为其最小可能值,若所有 \(b_i\) 的值都正确,则序列 \(b\) 合法。容易发现这样的映射是单射。
考虑统计合法 \(a\) 序列的数量:
首先填的时候可以考虑从小往大填,先钦定几个 \(b_i\) 对应区间大于当前值,然后剩下的没填的位置填当前值。
\(f(l, r, i)\) 表示值域为 \([1, i]\),只考虑 \(a_l,a_{l + 1},\cdots, a_r\) 的填法的数量。
每次增大值域,可以考虑把原有数全部 \(+1\),再新填数。
增大值域看似是从大往小填,但其实可以视作先处理出填大的方法数,再钦定区间填大的转移。
枚举填完后第一个为 \(1\) 的位 \(k\)(也就是第一个没有被钦定的位置),若没有则视为 \(r + 1\),则
\[f(l, r, i) \gets f(l, k - 1, i - 1)\times f(k + 1, r, i) \]这个转移的意思是,\([l, k - 1]\) 内的所有区间都被钦定了,\(k\) 没有被钦定,而后面的区间填的方法数已经计算好了,乘起来就好了,容易发现这样转移不会重复计入某种方案。
什么时候转移合法呢?区间 \([l, k-1]\) 包含的所有区间 \([l_i, r_i]\) 的并恰好为 \([l, k-1]\) 时就可以这么转移,这个是可以预处理出来的。
时间复杂度 \(\mathcal{O}(n^3c)\),但 \(c\) 太大了,考虑优化:容易发现答案是一个关于 \(c\) 的最高 \(n\) 次的多项式,证明的话可以考虑假设某种方案下最终填好的 \(a\) 里面有 \(k\) 种不同的数,那就有 \(\binom{c}{k}\) 的贡献,这是一个关于 \(c\) 的 \(k\) 次多项式,而 \(k\le n\),于是每种方案的贡献加起来仍是一个最高 \(n\) 次的多项式,因此求出值域分别为 \([1, 1]\) 到 \([1, n + 1]\) 的答案拉插就可以做到 \(\mathcal{O}(n^4)\)。
前几天数据结构写麻了,这题代码真好写啊。
标签:5016,值域,钦定,转移,序列,区间,考虑,qoj From: https://www.cnblogs.com/0922-Blog/p/qoj5016.html