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. \(1 \le j < x_{\min}\),则 \(ans_{j} \gets ans_{j} + j \cdot a_{i}\)
  2. \(x_{\min} \le j < x_{\max}\),则 \(ans_{j} \gets ans_{j} + x_{\min} \cdot a_{i}\)
  3. \(x_{\max} \le j \le len + 1\),则 \(ans_{j} \gets (len - j + 1) \cdot a_{i}\)
  4. 其它情况对 \(ans\) 无贡献。

以上几种情况画个图不难理解。

\(a_{i}\)\(ans\) 的贡献可以写成如下序列(为了方便,忽略了所有的 \(a_i\) 因子,只保留系数,同时 \(ans\)\(0\) 开始标号):

\[0, {\color{red}{1, 2, \cdots, x_{\min} - 1,}} {\color{green}{x_{\min}, x_{\min}, \cdots, x_{\min},}} {\color{blue}{x_{\min} - 1, \cdots, 1, 0,}} 0 \]

这相当于把答案序列加上了三个等差数列(中间的序列公差为 \(0\))。线段树可以维护等差数列,但我们不需要动态查询,因此有更简单的办法:把上面的序列差分一遍,得到

\[0, {\color{red}{1, 1, \cdots, 1,}} {\color{green}{1, 0, \cdots, 0,}} {\color{blue}{-1, \cdots, -1, -1,}} 0 \]

再差分一遍:

\[0, {\color{red}{1, 0, \cdots, 0,}} {\color{green}{0, -1, \cdots, 0,}} {\color{blue}{1, \cdots, 0, 0,}} -1 \]

于是在二阶差分序列上只用修改 \(O(1)\) 个值。最后把二阶差分序列做两遍前缀和就得到了答案。时间复杂度 \(O(n)\)

代码

posted @ 2025-05-27 09:48  DengStar  阅读(26)  评论(0)    收藏  举报