B. 数列 & LEQ and NEQ
原题但没有做出来, 不过当时写的是单 \(\log\) 做法.
题目描述
给定长度为 \(n\) 的正整数序列 \(a\)。
一个长度为 \(n\) 的序列 \(b\) 是好的,当且仅当对于 \(1 \leq i < n\),都有 \(b_i \neq b_{i+1}\)。
求解有多少个长度为 \(n\) 的好的正整数序列 \(b\),满足对于 \(1 \leq i \leq n\) 都有 \(1 \leq b_i \leq a_i\),答案对 \(998\ 244\ 353\) 取模。
思路
考虑一种 \(\mathcal{O}(nV)\) 的做法. 设 \(f_{i, j}\) 表示枚举到第 \(i\) 个数, 当前数填 \(j\) 的方案数. 转移时前缀和优化即可. 与正解联系并不大, 考场上止步于此.
正难则反, 我们考虑容斥.
我们称 \(b_i = b_{i + 1}\) 称为坏点, 设 \(F_i\) 表示至少有 \(i\) 对坏点的方案数, 答案即为 \(\displaystyle \sum_{i = 0}^n (-1)^i \cdot F_i\).
思考如何求出 \(F\) 数组, 我们可以设 \(f_{i, j}\) 表示当前枚举到第 \(i\) 个数, 已经有「\(j\) 对」坏点的方案数, 其中 「\(j\) 对」不单指两个数, 而是有 \(j\) 段连续且相等的段, 那么 \(F_i = f_{n, n - i}\).
不难写出 \(\mathcal{O}(n^3)\) 的转移式子
这里有一个 \(\rm{trick}\)
- 因为最终容斥系数 \((-1)^j\) 只与 \(j\) 的奇偶性相关, 所以 \(j\) 这一维可以用 \(0/1\) 进行代替.
因此式子可以改写成
可以发现我们可以将转移式子分为两段, 分别是 \(\displaystyle \min_{k = j + 1}^i a_k = a_i\) 和其他. 前面一段可以使用前缀和进行优化, 同时记上一个比 \(a_i\) 小的位置为 \(lst\)
因为在 \(1 \sim lst\) 中 \(a_{lst} < a_i\), 所以后面的式子可以改写为 \(\displaystyle \sum_{j = 1}^{lst - 1} f_{j, x} \times \min_{k = j + 1}^{lst} a_k = f_{lst, j}\), 直接继承过来. 对于 \(lst\) 不难使用单调栈维护, 所以这样一来就是线性的了.
结语
当时应该是抄的题解.
用了几个不熟容斥 \(\rm{trick}\), 长见识了.