F - Sanae and Giant Robot
分析:
-
妙妙题+结论
一定是从 s[i]=0 的点开始合并
-
set + 二分维护区间内点的删除
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N],b[N],s[N];
vector <int> g[N];
void solve()
{
int n,m;
cin>>n>>m;
set <int> st;
for(int i=0;i<=n;i++) g[i].clear(), st.insert(i);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]), s[i]=s[i-1]+a[i]-b[i];
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
u--;
g[u].push_back(v);
g[v].push_back(u);
}
queue<int> q;
for(int i=0;i<=n;i++)
{
if(!s[i])
{
q.push(i);
st.erase(i);
}
}
while(!q.empty())
{
int u=q.front(); q.pop();
for(int v : g[u])
{
if(s[v]) continue;
int l=min(u,v), r=max(u,v);
auto itl = st.lower_bound(l), itr = st.upper_bound(r);
for(auto it=itl; it!=itr; it++)
{
s[*it]=0; q.push(*it);
}
st.erase(itl,itr);
}
}
if(!st.size()) cout<<"YES\n";
else cout<<"NO\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}