好题
https://www.luogu.com.cn/problem/P10188
解法
ming,麻辣香锅,jklove,白色风车,otto,the shy 数学没龙哥强
考虑每次仅移动一升牛奶,那么如果每个点只有一个入度,一个出度,那么绝对不会产生浪费。
可是有些点有多个入度,这就导致了一个牛奶的浪费。但是浪费还需要一个条件,就是两个入度点都不为 \(0\) 才行。有一个点有两个入读的条件是出现了一个形如 \([r,l]\) 的环,而这个环是不可能用完的,所以只需要统计一边入度点的牛奶之和,求出所有双入度点取最大浪费量与时间的最小值的和即可。
时间复杂度 \(O(n)\)。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N];
string ops;
int n,m;
int movel(int x) {
if(x-1==0) return n;
return x-1;
}
int mover(int x) {
if(x+1==n+1) return 1;
return x+1;
}
int ans;
signed main() {
cin>>n>>m;
cin>>ops;ops=' '+ops;
for(int i=1;i<=n;i++) cin>>a[i],ans+=a[i];
for(int i=1;i<=n;i++) {
int sum=0;
if(ops[movel(i)]!='R'||ops[mover(i)]!='L') continue;
int l=movel(i),r=mover(i);
if(ops[i]=='R') while(ops[l]=='R') sum+=a[l],l=movel(l);
else while(ops[r]=='L') sum+=a[r],r=mover(r);
ans-=min(sum,m);
}
cout<<ans;
return 0;
}