其他分享
首页 > 其他分享> > Codeforces Round #788 (Div. 2) C. Where is the Pizza?

Codeforces Round #788 (Div. 2) C. Where is the Pizza?

作者:互联网

假设ci=ai,那么一定有cj=aj(aj= =bi),循环这个过程直到ck=ak(bk= =ai),这个过程中所选出的元素为一个集合(在b中也有一个相同的集合,只是顺序不同),不同集合数量为cnt,答案即为2^(cnt-m)(m为c确定的集合个数)

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int mod = 1e9+7;

LL qpow(int x,int k){
	LL base=x,res=1;
	while(k){
		if(k&1){
			res=res*base%mod;
		}
		base=base*base%mod;
		k>>=1;
	}
	return res;
}

int find(int x,vector<int> &fa){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x],fa);
}

int main(){
	ios::sync_with_stdio(false);
	int test,n;
	cin>>test;
	while(test--){
		cin>>n;
		vector<int> a(n+1),b(n+1),c(n+1),fa(n+1);
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i=1;i<=n;i++) cin>>b[i];
		for(int i=1;i<=n;i++) cin>>c[i];
		
		for(int i=1;i<=n;i++) fa[i]=i;
		
		int cnt=n;
		
		unordered_map<int,int> mii;
		
		for(int i=1;i<=n;i++){
			if(a[i]==b[i]){
				mii[a[i]]=1;
				cnt--;
				continue;
			}
			
			int u=find(a[i],fa);
			int v=find(b[i],fa);
			if(u!=v){
				cnt--;
				fa[u]=v;
			}
		}
		
				
		for(int i=1;i<=n;i++){
			if(c[i]){
				int u=find(c[i],fa);
				if(!mii[u]){
					cnt--;
					mii[u]=1;
				}
			} 
		}
		
		cnt=max(cnt,0);
		
		//cout<<"cnt:  "<<cnt<<endl;
		
		cout<<qpow(2,cnt)<<endl;
		
	}
	return 0;
} 

标签:int,res,LL,788,Codeforces,fa,test,Div,mod
来源: https://www.cnblogs.com/xhy666/p/16245795.html