题解 CF1373F 【Network Coverage】
赛后一分钟做出来有点崩溃,好在它重测的时候 FST 了。(雾
容易发现,只要确定了
做法 1:
二分这个 “
这里主要讲的不是这个,具体做法就直接推神仙 wyy 的题解了:here。
时间复杂度:
做法 2:
网络流。具体做法不再展开。
Q:
A:我不清楚但是我同学过了,可能因为图比较特殊吧。(提交记录)
有兴趣可以研究一下。
做法 3:
我具体要讲的做法,并且是线性做法。
换一个思路:
设
这样就可以得到一堆不等式:
愉快地差分约束一波然后建图。
所以可以维护
如果某个位置满足
注意由于这是个环,所以要把环拆开然后复制一遍。
时间复杂度:
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
#define N 1000010
int n,T,a[N],b[N];
bool Solve(){
n=read();
ll sum=0;
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)b[i]=read();
for(int i=1;i<=n;++i)sum+=a[i]-b[i];
if(sum>0)return false;
sum=0;
ll mn=b[1];
for(int i=1;i<=(n<<1)+1;++i){
sum+=a[i%n+1]-b[i%n+1];
mn=min(mn,b[i%n+1]+sum);
if(mn<sum)return false;
}
return true;
}
int main(){
T=read();
while(T--){
printf(Solve()?"YES\n":"NO\n");
}
return 0;
}
Froggy's blog