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;
}
View Code

 

 
posted @ 2023-08-18 10:42  JMXZ  阅读(5)  评论(0)    收藏  举报