【題解】AtCoder ABC 183F – Confluence

【題目敘述】https://atcoder.jp/contests/abc183/tasks/abc183_f
【解題想法】並查集 (DSU)

#include <bits/stdc++.h>
using namespace std;

int n, q, c[200005], p[200005];
map <int, int> mp[200005];

int f(int x){
    if (p[x] < 0) return x;
    return p[x] = f(p[x]);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; i++){
        cin >> c[i];
        p[i] = -1;
        mp[i][c[i]]++;
    }
    int t, a, b;
    while (q--){
        cin >> t >> a >> b;
        if (t == 1){
            a = f(a);
            b = f(b);
            if (a == b) continue;
            if (-a < -b) swap(a, b);
            for (auto i:mp[b]){
                mp[a][i.first] += i.second;
            }
            p[a] += p[b];
            p[b] = a;
        }
        else cout << mp[f(a)][b] << "\n";
    }
}

分享本文 Share with friends