60pts求助
查看原帖
60pts求助
348327
Chtholly39楼主2024/11/27 11:47
#include<bits/stdc++.h>
#define ll long long
#define N 200009
#define MOD 10000000000
using namespace std;
ll n,m,k,fa[N],x[N],y[N],col[N],g[N],t[2]={1,1},ans; 
ll find(ll x){
	if(x==fa[x]) return x;
	ll u=find(fa[x]);
	g[x]^=g[fa[x]];
	return fa[x]=u;
}
ll find_ans(){
	ll res=-1;
	for(ll i=1;i<=n+m;i++) fa[i]=i,g[i]=0;
	fa[n+1]=1;
	for(ll i=1;i<=k;i++){
		ll fx=find(x[i]),fy=find(y[i]+n);
		ll temp=g[x[i]]^g[y[i]+n]^col[i];
		if(fx!=fy) fa[fx]=fy,g[fx]=temp;
		else if(temp) return 0;
	}
	for(ll i=1;i<=n+m;i++){
		if(fa[i]==i){
			if(res==-1) res=1;
			else res<<=1;
			res%=MOD;
		}
	}
	return res;
}
int main(){
	cin>>n>>m>>k;
	for(ll i=1;i<=k;i++){
		cin>>x[i]>>y[i]>>col[i];
		if(x[i]==1&&y[i]==1) t[col[i]^1]=0,--k,--i;
		else if(x[i]%2==0&&y[i]%2==0) col[i]^=1;
	}
	if(t[0]) ans=(ans+find_ans())%MOD;
	if(t[1]){
		for(ll i=1;i<=k;i++) if(x[i]>1&&y[i]>1) col[i]^=1;
		ans=(ans+find_ans())%MOD;
	}
	ans%=MOD;
	cout<<ans<<endl;
	return 0;
}
//?

WA#3,#5,#7,#9,#11,#17,#18,#19

2024/11/27 11:47
加载中...