描述
要开篝火晚会了!现在有 N 个人排成一圈, 对于第 i 个人来说,他右面的人的编号为 i+1,第 n 个人右面的编号为 1。
每个人有一个容量为 ai 的酒杯。一开始所有人的酒杯都装满了啤酒。
但是大家的酒品不是很好,都喜欢逃酒!
每一分钟,所有人都会根据一个字符串 s_1 s_2 \dots s_N 将啤酒“不小心”洒一点到左右两边的人杯中,该字符串仅由字符L和R$ 组成。
当第 i 个人至少有 1 升啤酒时,如果 si=L,他会将 1 升啤酒洒给她左边的人的酒杯中,如果 si=R,她会将 1 升啤酒洒到右面的人的酒杯里。
所有交换同时发生(即,如果一个人的酒杯是满的,送出 1 升啤酒的同时,也收到 1 升啤酒——好恶心,则她杯中酒的总量保持不变)。
如果此时一个人的啤酒超过了杯子的容量 ai ,则多余的啤酒会洒在地上。
问:经过 M 分钟后,所有人的酒杯中总共还余下多少啤酒?
输入描述
输入的第一行包含 N 和 M。
第二行包含一个字符串 s ,仅由字符 L 或 R 组成,表示每个人洒啤酒的方向。
第三行包含整数 a_1,a_2, \dots a_N$ ,为每个酒杯的容量。
数据范围
1≤N≤2×105,1≤M≤109,1≤ai≤109
输出描述
输出一个整数表示答案
用例输入 1
3 1
RRL
1 1 1
用例输出 1
2
用例输入 2
5 20
LLLLL
3 3 2 3 3
用例输出 2
14
用例输入 3
9 5
RRRLRRLLR
5 8 4 9 3 4 9 5 4
用例输出 3
38
提示
样例1解释 2 号和 3 号 互相洒了一升啤酒,因此他们的啤酒总量保持不变。
当 1 号 将啤酒洒给 2 号 时, 2 号 的桶会溢出,从而一分钟后损失了一升啤酒(浪费了)。
# include <bits/stdc++.h>
using namespace std;
int n, m;
string s;
int a[200010], b[200010];
int main () {
cin >> n >> m;
cin >> s;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
b[i] = a[i];
}
for (int k = 1; k <= m; k ++) {
for (int i = 1; i <= n; i ++) {
if (a[i] >= 1) {
if (s[i] == 'L') {
if (i == 1) a[n] += 1, a[1] -= 1;
else a[i - 1] += 1, a[i] -= 1;
} else {
if (i == n) a[1] += 1, a[n] -= 1;
else a[i + 1] += 1, a[i] -= 1;
}
}
}
for (int i = 1; i <= n; i ++) {
if (a[i] > b[i]) b[i] = a[i];
}
}
int sum = 0;
for (int i = 1; i <= n; i ++) sum += a[i];
cout << sum;
return 0;
}