解题思路:
并查集求最大联通快、

然后扫描的时候 相邻不在同一个并查集就直接把两个集合加起来取最大
注意事项:

参考代码:

#include <iostream>

#include<vector> 

#include<algorithm>

#define ll long long

#define endl "\n"

using namespace std;

int n, m, k; int T, ncase = 0; const int N = 1e6 + 3, mod = 1e9 + 7;

int a[N]; int fa[N], siz[N]; 

int find(int x) {

if (fa[x] != x)return fa[x] = find(fa[x]);

return fa[x];

}

int main()

{

ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

cin >> n;

for (int i = 1; i <= n; i++) {

cin >> a[i]; fa[i] = i; siz[i] = 1;

}

ll ans = 0;

for (int i = 1; i <= n; i++) {

int cnt = i;

do {

int rx = find(cnt);

int ry = find(a[cnt]);

if (rx == ry)break;

fa[rx] = ry; 

siz[ry] += siz[rx];

m = max(m, siz[ry]);

cnt = a[cnt];

} while (cnt!=a[cnt]);

}

for (int i = 2; i <= n; i++) {

if (fa[i] != fa[i - 1]) {

m = max(siz[fa[i]]+ siz[fa[i - 1]],m);

}

}cout << m;

return 0;

}


点赞(2)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论