90pts求助
查看原帖
90pts求助
537998
lpx2024楼主2024/7/26 08:06

莫名其妙挂在了#11和#12

#include<bits/stdc++.h>
using namespace std;
const int maxN=100010;
int a[maxN],b[maxN],f[maxN],g[maxN],fa[maxN];
bool book[maxN];
vector<int> v[maxN];
int Find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=Find(fa[x]);
}
void merge(int x,int y){
	x=Find(x),y=Find(y);
	if(x!=y){
		fa[x]=y;
		a[y]+=a[x];
		b[y]+=b[x];
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		memset(book,0,sizeof(book));
		int n,m,cnt=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++) scanf("%d",&b[i]);
		for(int i=1;i<=n;i++){
			fa[i]=i;
			v[i].clear(); 
		}
		int opt,x,y; 
		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&opt,&x,&y);
			if(opt==1){
				cnt++;
				f[cnt]=x,g[cnt]=y;
			} else {
				merge(x,y);
			}
		}
		for(int i=1;i<=cnt;i++){
			v[Find(f[i])].push_back(Find(g[i]));
			v[Find(g[i])].push_back(Find(f[i]));
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<v[i].size();j++){
				merge(v[i][j],v[i][j-1]);
			}
		}
		bool flag=0;
		for(int i=1;i<=n;i++){
			int p=Find(i);
			if(book[p]) continue;
			book[p]=1;
			if(!v[p].size()){
				if(a[p]!=b[p]) flag=1;
			}
			for(int j=0;j<v[p].size();j++){
				int q=Find(v[p][j]);
				if(p==q){
					if((a[p]-b[p])&1==0) flag=1;
				} else {
					if(a[p]-b[p]!=a[q]-b[q]) flag=1;
				}
			}
		}
		if(flag==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	} 
	return 0;
} 
2024/7/26 08:06
加载中...