Single-use Stones Codeforces

https://codeforces.com/contest/965/problem/D

太神仙了。。。比E难啊。。

首先呢,根据题意,可以很容易的建出一个最大流模型

就是每个位置建一条边,容量限制为该位置石头数,向所有它能直接跳到的位置的边的起点连边(容量无限)

(当然起点和对岸也要分别建一条边,容量无限,并按一样的规则与其他的地方间连边)

那么答案就是从起点到对岸的最大流

显然不能直接跑。。。

而最大流=最小割,显然如果是最小割,那么不能包括任何容量无限的边,那么只能选由位置产生的边

经过观察分析,如果是一个割,那么一定包含[a,b]区间内的所有位置产生的边,且满足b-a+1<=l

那么枚举每个长为l的区间即可。。。

代码很短

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 int w,l,a[100100],ans=0x3f3f3f3f;
14 int main()
15 {
16     int i;
17     scanf("%d%d",&w,&l);
18     for(i=1;i<w;i++)    scanf("%d",&a[i]),a[i]+=a[i-1];
19     for(i=1;i+l-1<w;i++)    ans=min(ans,a[i+l-1]-a[i-1]);
20     printf("%d",ans);
21     return 0;
22 }
原文地址:https://www.cnblogs.com/hehe54321/p/9394723.html