解题思路:
并查集求最大联通快、
然后扫描的时候 相邻不在同一个并查集就直接把两个集合加起来取最大
注意事项:
参考代码:
#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;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复