Codeforces Round #788 (Div. 2) C. Where is the Pizza?
阿新 • • 發佈:2022-05-08
假設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; }