CF1373F Network Coverage

显然考虑如果我们只是一条链的话,那么显然是很好判断的。
但是现在是一个环,我们思考其实我们的关键问题是不知道 \(a_1\)\(a_n\) 流了多少过来。
我们发现其有单调性,我们可以直接二分。

#include<iostream>
#include<cstdio>
#define ll long long 
#define N ((ll)1e6 + 5)

int n,m,a[N],b[N],c[N],Q,ans;

inline int check(int x){
	for(int i = 1;i <= n;++i)
	c[i] = a[i];
	int res = b[1] - x;//向右流的流 
	c[1] = std::max(0,a[1] - x);//c:需要的 
	for(int i = 2;i <= n;++i){
		c[i] -= res;
		c[i] = std::max(c[i],0);
		if(c[i] > b[i])return 2;//流量不够用
		res = b[i] - c[i]; 
		c[i] = 0;
	}
	if(c[1] > res)return 1;
	return 0;
}

int T;

#define mid ((l + r) >> 1)

int main(){
	scanf("%d",&T);
	while(T -- ){
		scanf("%d",&n);
		for(int i = 1;i <= n;++i)
		scanf("%d",&a[i]);
		for(int i = 1;i <= n;++i)
		scanf("%d",&b[i]);
		int l = 0,r = b[1];
		int flg = 0;
		while(l <= r){
			int lim = check(mid);
			if(!lim){
				flg = 1;
				puts("YES");
				break;
			}
			if(lim == 2){
				r = mid - 1;
			}
			if(lim == 1){
				l = mid + 1;
			}
		}
		if(!flg)
		puts("NO");
	}
}
原文地址:https://www.cnblogs.com/dixiao/p/15424998.html