ABC407 EF 题解
ABC407 EF 题解
唉,烂完了。
E. Most Valuable Parentheses
最优化问题,先考虑贪心和 dp。
直接做没有思路,从括号序列的性质着手。注意到合法括号序列等价于满足下述条件的序列:
- 任意长度为 \(i\) 的前缀中都有至少 \(\lceil \frac{i}{2} \rceil\) 个
(。 (和)的数量相同。
由于 \(\lceil \frac{i}{2} \rceil\) 只在 \(i\) 是奇数时 \(+1\),所以我们在 \(i\) 为奇数时更新答案,也就是从 \([1, i]\) 中任选一个没选过的位置变为 (。显然这样构造出的括号序列一定是合法的,并且每次贪心取权值最大的最优。用优先队列维护。
F. Sums of Sliding Window Maximum
这道题的套路非常典。(但我怎么不会?)
我们需要求出 \(k = 1, 2, \cdots, n\) 的答案,考虑用某种方式同时更新整个答案序列。
用单调栈求出 \(a_i\) 能作为最大值的极长区间 \([l_i, r_i]\)(\(l_i \le i \le r_i\))。由于可能有相同的元素,而我们希望每个区间只被统计一次,所以做如下规定:
- \([i, r_i]\) 中可以有和 \(a_i\) 相同的元素。
- \([l_i, i]\) 中不可以有和 \(a_i\) 相同的元素,即 \(a_i\) 是此区间中的严格最大值。
可以发现这样规定确实不重不漏地统计了所有区间。
然后考虑每个 \(a_i\) 对答案序列的贡献。对某个区间 \([x, y]\),如果 \(l_i \le x \le i \le y \le r_i\),那么 \(a_i\) 就是 \([x, y]\) 中的最大值。把这些区间分长度讨论,设区间长度为 \(j\),统计有多少个长度为 \(j\) 的区间的最大值为 \(a_i\)。具体地,设 \(x_{\min}\) 和 \(x_{\max}\) 分别为 \(i - l_i + 1\) 和 \(r_i - i + 1\) 中的较小值和较大值,\(len = r_i - l_i + 1\),则
- 若 \(1 \le j < x_{\min}\),则 \(ans_{j} \gets ans_{j} + j \cdot a_{i}\);
- 若 \(x_{\min} \le j < x_{\max}\),则 \(ans_{j} \gets ans_{j} + x_{\min} \cdot a_{i}\);
- 若 \(x_{\max} \le j \le len + 1\),则 \(ans_{j} \gets (len - j + 1) \cdot a_{i}\);
- 其它情况对 \(ans\) 无贡献。
以上几种情况画个图不难理解。
\(a_{i}\) 对 \(ans\) 的贡献可以写成如下序列(为了方便,忽略了所有的 \(a_i\) 因子,只保留系数,同时 \(ans\) 从 \(0\) 开始标号):
这相当于把答案序列加上了三个等差数列(中间的序列公差为 \(0\))。线段树可以维护等差数列,但我们不需要动态查询,因此有更简单的办法:把上面的序列差分一遍,得到
再差分一遍:
于是在二阶差分序列上只用修改 \(O(1)\) 个值。最后把二阶差分序列做两遍前缀和就得到了答案。时间复杂度 \(O(n)\)。

浙公网安备 33010602011771号