简单思维题95pts WA#16求助
查看原帖
简单思维题95pts WA#16求助
556545
_anll_楼主2024/9/5 21:48

rt,照着第6篇题解改的,真的找不出来问题了求捞捞QAQ!

#include<iostream>
#define int long long
using namespace std;
const int N=1e6,mod=1e9;
int n,m,k,X[N],Y[N],A[N],tag[2];
int ans,fas[N<<1],len[N<<1];
int qmi(int x,int y){
	if(y<0) return 0;
	int base=x,an=1;
	while(y){
		if(y&1) an=an*base%mod;
		base=base*base%mod,y>>=1;
	}
	return an;
}
int Find(int x){
	if(x!=fas[x]){
		int fa=Find(fas[x]);
		len[x]^=len[fas[x]];
		fas[x]=fa;
	}
	return fas[x];
}
int solve(int w,int siz=n+m){
	for(int i=1;i<=n+m;i++) fas[i]=i,len[i]=0;
	fas[1]=fas[1+n];siz--;
	for(int i=1;i<=k;i++){
		int x=X[i],y=Y[i]+n,a=(A[i]^w);
		if(X[i]%2==0&&Y[i]%2==0) a^=1;
		int fx=Find(x),fy=Find(y);
		if(fx!=fy){
			fas[fx]=fy;siz--;
			len[fx]^=len[x]^len[y]^a;
		}
		else if((len[x]^len[y])!=a) return 0;
	}
	return qmi(2,siz-1);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++){
		cin>>X[i]>>Y[i]>>A[i];
		if(X[i]==1&&Y[i]==1) tag[A[i]]=1,i--,k--;
	}
	if(!tag[0]) ans=(ans+solve(0))%mod;
	if(!tag[1]) ans=(ans+solve(1))%mod;
	cout<<ans;
	return 0;
}
2024/9/5 21:48
加载中...