返回题目问答
讨论 / 题目问答/ 帖子详情

测试案例有问题

我用最普通的并查集写,一开始没考虑相邻数才能传送,但是通过了,我感觉要加一条测试案例

5
2 1 3 5 4

代码如下

#include<bits/stdc++.h>
using namespace std;
class UnionFind{
public:
    int n;
    vector<int>fa;
    vector<int>sz;
public:
    UnionFind(int _n) :n(_n),fa(_n), sz(_n,1) {
        for (int i = 0; i < n; i++) fa[i] = i;
    }
    int f(int i) {
        if (fa[i] != i)fa[i]= f(fa[i]);
        return fa[i];
    }
    void Union(int a, int b) {
        int x = f(a), y = f(b);
        if (x != y) {
            if (sz[x] > sz[y]) {
                fa[y] = x;
                sz[x] += sz[y];
                sz[y] = 0;
            }
            else {
                fa[x] = y;
                sz[y] += sz[x];
                sz[x] = 0;
            }
        }
    }
    void res() {
        sort(sz.begin(), sz.end(), [](int& a, int& b) {return a > b; });
        cout << sz[0] + sz[1] << endl;
    }
};
int main() {
    int n;
    cin >> n;
    vector<int>nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
        nums[i]--;
    }
    UnionFind un(n);
    for (int i = 0; i < n; i++) {
        un.Union(i, nums[i]);
    }
    un.res();
    return 0;
}
2 回复 0 转发 0 喜欢 39 阅读
回复 (2)
默认 最新
应该增加这种例子:2 3 4 1 7 5 6 9 10 11 8
按楼主解法不考虑邻近,答案应该是8,但是正确答案应该是7
0
Wangzyy 2025/3/11
5 2 1 3 5 4不是排列啊
0