好题

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;
}
posted @ 2024-10-04 20:05  PM_pro  阅读(8)  评论(0)    收藏  举报