CF1833E Round Dance

//find->fa[i]=i //因为有环 所以 双向边标记之访问一次 //fa[find()]=find() 没关系 但siz+=.....有问题 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=2e5+10; int n,a[maxn],fa[maxn],du[maxn],cnt; set<int> st; map<pair<int,int>,int> mp; int find(int x){ return x==fa[x]? x:fa[x]=find(fa[x]); } int main() { ios::sync_with_stdio(false); int T;cin>>T; while(T--) { st.clear();mp.clear();cnt=0; memset(fa,0,sizeof(fa));memset(du,0,sizeof(du)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i],fa[i]=i;//find->fa[i]=i for(int i=1;i<=n;i++){ if(mp[{i,a[i]}]) continue; mp[{i,a[i]}]=mp[{a[i],i}]=1; ++du[i],++du[a[i]]; int u=find(i),v=find(a[i]); if(u==v) continue; fa[u]=v; } for(int i=1;i<=n;i++){ if(du[i]==1) cnt++; st.insert(find(i)); } cout<<min(st.size(),st.size()-cnt/2+1)<<" "<<st.size()<<'\n'; } return 0; }