Submission #1179190

#TimeUsernameProblemLanguageResultExecution timeMemory
1179190igofanMergers (JOI19_mergers)C++20
0 / 100
41 ms12600 KiB
#include <bits/stdc++.h>

using namespace std;

struct DSU {
    vector<int> e;
    DSU(int N) { e = vector<int>(N, -1); }
    // get representive component (uses path compression)
    int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); }
    bool same_set(int a, int b) { return get(a) == get(b); }
    int size(int x) { return -e[get(x)]; }
    bool unite(int x, int y) {  // union by size
        x = get(x), y = get(y);
        if (x == y) return false;
        if (e[x] > e[y]) swap(x, y);
        e[x] += e[y]; e[y] = x;
        return true;
    }
};

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, k; cin >> n >> k;
    vector<vector<int>> adj(n+1);
    for(int i=0; i<n-1; i++) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    DSU dsu(n+1);
    vector<vector<int>> st(k+1);
    for(int i=1; i<=n; i++) {
        int state; cin >> state;
        st[state].push_back(i);
    }
    for(int i=1; i<=k; i++) {
        for(int j=1; j<st[i].size(); j++) {
            dsu.unite(st[i][0], st[i][j]);
        }
    }
    vector<int> degree(n+1, 0);
    for(int i=1; i<=n; i++) {
        int u = dsu.get(i);
        for(auto j : adj[i]) {
            if (i > j) continue;
            degree[u]++;
            degree[dsu.get(j)]++;
        }
    }

    int ans = 0;
    for(int i=1; i<=n; i++) {
        if (degree[i] == 1) {
            ans++;
        }
    }
    ans = (ans + 1)/2;
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...