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");
}
}