社区讨论

WA 80pts MnZn求助

P6185[NOI Online #1 提高组] 序列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lyxvsqtg
此快照首次捕获于
2024/07/23 11:53
2 年前
此快照最后确认于
2024/07/23 13:39
2 年前
查看原帖
C
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
#define int long long
int T,n,m,a[N],b[N],t[N],u[N],v[N],vis[N],fa[N],match[N],tot[N],tot2[N];
vector<int> G[N];
bool flag3=true;
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy){
		fa[fx]=fy;
	}
}
void dfs(int x,int f){
	if(vis[x]==-1) vis[x]=!vis[f];
	for(int i=0;i<G[x].size();i++){
		int y=G[x][i];
		if(vis[y]==vis[x]){
			flag3=false;
			return;
		}
		else if(vis[y]!=vis[x]&&vis[y]!=-1) continue;
		if(f!=0){
			merge(f,y);
		}
		dfs(y,x); 
	}
}
bool dfs2(int x,int t){
	if(vis[x]==t){
		return false;
	}
	vis[x]=t;
	for(int i=0;i<G[x].size();i++){
		int y=G[x][i];
		if(match[y]==0||dfs2(match[y],t)){
			match[y]=x;
			return true;
		}
	}
	return false;
}
signed main(){
	cin>>T;
	while(T--){
		cin>>n>>m;
		int sum=0;
		flag3=true;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			sum+=a[i];
			fa[i]=i;
			vis[i]=-1;
			G[i].clear();
			match[i]=0;
			tot[i]=0;
			tot2[i]=0;
		}
		int tmp=0;
		for(int i=1;i<=n;i++){
			cin>>b[i];
			tmp+=b[i];
		} 
		for(int i=1;i<=m;i++){
			cin>>t[i]>>u[i]>>v[i];
			if(t[i]==2){
				if(u[i]!=v[i]) merge(u[i],v[i]);
			}
		}
		bool flag2=false;
		for(int i=1;i<=m;i++){
			if(t[i]==1){
				int fx=find(u[i]),fy=find(v[i]);
				if(fx!=fy){
					G[fx].push_back(fy);
					G[fy].push_back(fx);
				}
				else flag2=true;
			}
		}
		for(int i=1;i<=n;i++){
			if(vis[i]==-1){
				dfs(i,0);
			}
		}
		for(int i=1;i<=n;i++) vis[i]=0;
		int cnt=0;
		if(flag3){
		    for(int i=1;i<=n;i++){
			    if(fa[i]==i){
				    if(dfs2(i,i)){
				        ++cnt;
				    }
			    }
		    }
		}
		bool flag=true;
		if(cnt==0){
			if(flag2&&(tmp%2==sum%2)){
				cout<<"YES"<<endl;
			}
			else if(tmp==sum){
				cout<<"YES"<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
		else{
			for(int i=1;i<=n;i++){
				tot[fa[i]]+=a[i];
				tot2[fa[i]]+=b[i];
			}
			for(int i=1;i<=n;i++){
				if(fa[i]==i){
					if(match[i]==0){
						if(tot[i]!=tot2[i]){
							flag=false;
							break;
						}
					} 
					else{
						if((tot[i]-tot2[i])!=(tot[match[i]]-tot2[match[i]])){
							flag=false;
							break;
						}
					}
				}
			}
			if(flag) cout<<"YES"<<endl;
			else cout<<"NO"<<endl;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...