左右不分(Right Left Wrong)
https://codeforces.com/problemset/problem/2000/D
左右不分(Right Left Wrong)
题目描述
Vlad 找到了一条长度为 \(n\) 的格子带,从左到右编号为 \(1\) 到 \(n\)。
第 \(i\) 个格子中有一个正整数 a[i] 和一个字符 s[i],其中 s[i] 仅为 'L' 或 'R'。
Vlad 希望你通过执行任意次数(包括 0 次)的操作来获得最多的积分。
操作定义
在一次操作中,你可以选择两个下标 l 和 r(满足 1 <= l < r <= n),并且:
s[l] == 'L' 且 s[r] == 'R'
然后你可以:
将 a[l] + a[l+1] + ... + a[r] 加入当前得分;
将下标从 l 到 r 的所有 s[i] 替换为 '.',表示这些格子不能再被使用。
示例说明
a: 3 5 1 4 3 2
s: L R L L L R
| 3 | 5 | 1 | 4 | 3 | 3 |
|---|---|---|---|---|---|
| L | R | L | L | L | R |
你可以:
选择 l = 1, r = 2,得分增加 3 + 5 = 8,s 变成 . . L L L R
| 3 | 5 | 1 | 4 | 3 | 3 |
|---|---|---|---|---|---|
| . | . | L | L | L | R |
然后选择 l = 3, r = 6,得分增加 1 + 4 + 3 + 2 = 10,s 变成 . . . . . .
| 3 | 5 | 1 | 4 | 3 | 3 |
|---|---|---|---|---|---|
| . | . | . | . | . | . |
最终总分为 18,没有更多可行的操作。
输入格式
第一行一个整数 t(1 <= t <= 10000),表示测试用例的数量。
每个测试用例包含三行:
一个整数 n(2 <= n <= 200000)——格子数量;
n 个正整数 a[1], a[2], ..., a[n](1 <= a[i] <= 100000);
一个由 n 个字符组成的字符串 s,每个字符为 'L' 或 'R'。
保证所有测试用例中,n 的总和不超过 200000。
输出格式
每个测试用例输出一行一个整数,表示可以获得的最大得分。
示例输入
4
6
3 5 1 4 3 2
LRLLLR
2
2 8
LR
2
3 9
RL
5
1 2 3 4 5
LRLRR
示例输出
18
10
0
22
注意事项
测试用例的最后一个case的输出是22,而不是15,请仔细思考。
使用完之后的l,r设置成 . 代表这个区间使用过了,是指遍历 字符串的时候,这个区间的字符串已经使用了,不能再次使用这个字符串的字符了,
不是指相应位置上的数字使用过了不能再次使用。
Comments