对于数组 \(a\),定义 \(w(a)\) 为 \(a\) 中满足 \(a_i > mex(a)\) 的下标数。现在给定长度为 \(n\) 的数组,对于每个 \(r\), 求出 \(\max\limits_{l = 1}^{r} w(a[l \sim r])\)。
考虑枚举 \(x = mex(a)\),设 \(x\) 出现的位置是 \(p_1 < p_2 < \cdots < p_k\)。对于 \(r = p_i\) 是没有贡献的,对于 \(p_i < r < p_{i + 1}\) 的贡献是 \(a_{p_i + 1} \sim a_r\) 中 \(> x\) 的数量(取 \(l = p_i + 1\))。
但是这有个问题,不能保证 \(x\) 为 \(a_{l} \sim a_r\) 的 \(mex\)。但没有关系,因为这个 \(mex\) 一定小于等于 \(x\),且真正的 \(mex\) 对 \(r\) 的贡献肯定不劣于 \(x\) 对 \(r\) 的贡献(\(> mex\) 的数更多)。
设 \(b_i\) 表示 \(i = mex\) 对当前 \(r\) 的贡献。从左往右扫一遍 \(r\),有一下三种情况:
- \(a_r = i\),\(b_i \leftarrow 0\)。
- \(a_r > i, b_i \leftarrow b_i + 1\)。
- \(a_r < i\),\(b_i\) 不变。
现在问题就转化为了一个区间加与单点赋值的问题,使用线段树轻松解决。
时间复杂度:\(O(n \log V)\)。
此题关键是想到枚举 \(mex\),考虑 \(mex\) 对 \(r\) 的贡献,然后进行扫描线即可。(没想到扫描线纯 sb)