返回题解分享
讨论 / 题解分享/ 帖子详情

传送阵(编程题) - 题解

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int N=1000000+10;
int n,ans;
int a[N],fa[N],cnt[N];
void init()
{
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
        cnt[i]=1;
    }
}
int find(int x)
{
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
void union_(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x!=y)
    {
        fa[x]=y;
        cnt[y]+=cnt[x];
    }
}
void solve()
{
  cin>>n;
  init();
  for(int i=1;i<=n;i++)
  {
      cin>>a[i];
      union_(i,a[i]);
  }
  for(int i=1;i<=n;i++)
  {
      ans=max(ans,cnt[find(i)]);
      if(find(i)!=find(i+1))
      {
          ans=max(ans,cnt[find(i)]+cnt[find(i+1)]);
      }
  }
  cout<<ans;
}
signed main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  t=1;
  // cin>>t;
  while(t--)
  {
    solve();
  }
  return 0;
}
0 回复 0 转发 0 喜欢 5 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!