玄学问题
查看原帖
玄学问题
101761
NanNanzi_QvQ楼主2024/1/17 16:52
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 5;
int fa[maxn], n, m, u, v, a[maxn][3], ans[maxn], x[maxn], y[maxn], f[maxn][3];
list<int> s[maxn];
int find(int x) { 
    return x == fa[x] ? x : fa[x] = find(fa[x]); 
}
void merge(int x, int y) {
    int rx = find(x), ry = find(y);
    if (rx < ry) swap(rx, ry);
    if (rx != ry) {
        fa[rx] = ry;
        s[ry].splice(s[ry].end(), s[rx]);
    }
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i][1] >> a[i][2];
        ans[i] = -1;
        fa[i] = i;
        s[i].push_back(i);
    }
    for (int i = 1; i <= m; i++) {
        cin >> x[i] >> y[i];
        f[x[i]][y[i]] = 1;
    }
    for (int i = 1; i <= n; ++i) {
        if (!f[i][1] && a[i][1] != -1) merge(i, a[i][1]);
        if (!f[i][2] && a[i][2] != -1) merge(i, a[i][2]);
    }
    for (int i = m; i >= 1; i--) {
        if (a[x[i]][y[i]] == -1) continue;
        int p = find(x[i]), q = find(a[x[i]][y[i]]);
        if (p != q) {
            if (p == 1 || q == 1)
                for (auto j : s[max(p, q)]) 
                    ans[j] = i - 1;
            merge(p, q);
        }
    }
    for (int i = 1; i <= n; i++)
        cout << ans[i] << endl;
    return 0;
}

上面的代码82pts,RE两个点,但是把maxn从2e5改成4e5就AC了,到底是哪个地方RE了,怎么也找不到...

2024/1/17 16:52
加载中...