0%

CF2000D Right Left Wrong

题意简述

Vlad 找到了一条由 $n$ 个单元格组成的带子,带子的编号从左到右依次为 $1$ 到 $n$。在第 $i$ 个单元格中,有一个正整数 $a_i$ 和一个字母 $s_i$,所有的 $s_i$ 要么是 ‘L’,要么是 ‘R’。

Vlad 邀请你尝试通过执行任意次数(可能为零)的操作来获得尽可能多的分数。

在一个操作中,你可以选择两个索引 $l$ 和 $r$($1 \le l < r \le n$),使得 $s_l = ‘L’$ 并且 $s_r = ‘R’$,然后执行以下操作:

  • 将 $al + a{l + 1} + \dots + a_{r - 1} + a_r$ 的值添加到当前分数中;
  • 将所有满足 $l \le i \le r$ 的 $s_i$ 替换为 ‘.’,这意味着你不能再选择这些索引。

Vlad 能够获得的最大分数是多少?

思路分析

结论:答案一定是由若干完全嵌套的 L-R 对组成的。可以使用双指针从大到小搜索。

理由分析

  1. 操作规则:每次操作都是将一段连续的 LR 之间的部分选出并累加分数,且一旦选中,这部分的单元格将无法再使用。因此,任何两个不同的 L-R 对之间的区间不能有交集。

  2. 非相交的特性:假设存在两组 L-R 对,记为 $(l_1, r_1)$ 和 $(l_2, r_2)$,满足 $l_1 < l_2 < r_1 < r_2$ 或 $l_2 < l_1 < r_2 < r_1$,那么这两组对可以合并成一个 L-R 对 $(l_1, r_2)$ 或 $(l_2, r_1)$,这样可以获得更大的分数。

  3. 同层嵌套的合并:如果存在多个 L-R 对在同一个嵌套层级(如 **L**R**L**R**),那么将这些对合并为一个更大的 L-R 对会得到不小于原来的分数,并且减少了操作次数。

解题步骤

  1. 初始化:创建两个指针 $l$ 和 $r$,分别指向左边界和右边界,初始时 $l = 1$,$r = n$。

  2. 寻找嵌套对:从右向左移动 $r$,从左向右移动 $l$,找到满足条件的 LR

  3. 计算分数并更新状态:每找到一对 $(l, r)$,计算该区间的分数和,将其添加到总分数中.

  4. 继续查找:重复步骤 2 和 3,直到无法找到新的 L-R 对。

  5. 输出结果:最终累加的分数即为 Vlad 能够获得的最大分数。