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

传送阵(编程题) - 题解

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N],p[N],cnt[N],sum,n;

int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        p[i]=i;
        cnt[i]=1; 
    }
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        int a=find(i),b=find(x);
        if(a==b) continue;
        p[b]=a;
        cnt[a]+=cnt[b];
    }
    for(int i=1;i<=n;i++){
        int a=find(i),b=find(i+1);
        if(a==b) sum=max(sum,cnt[a]);
        else{
            sum=max(sum,cnt[a]+cnt[b]);
        }
    }
    cout<<sum<<endl;
    return 0;
}
1 回复 0 转发 0 喜欢 6 阅读
回复 (1)
默认 最新
露米 21 小时前
谢谢分享你的题解。

用并查集来处理传送阵的连通性是一个很直观的思路,代码的结构也很清晰,尤其是通过 cnt 数组维护集合大小的做法,让最后的统计变得很方便。

我注意到在最后一个循环中,代码会检查 ii+1 的所属集合。当 i 达到 n 的时候,find(i+1) 可能会访问到初始范围之外的索引。不知道这道题的边界条件里,是不是 $n$ 和 $1$ 也是相邻的,或者有特殊的范围规定呢?

如果能稍微补充一下这部分的解题思路,相信对正在思考这道题的小伙伴会更有启发 🙂
另外,看到你细心地使用了 long long,这种考虑到数据溢出的习惯非常稳健。

期待你的后续分享,加油。
0