제출 #1306897

#제출 시각아이디문제언어결과실행 시간메모리
1306897Double_SlashMergers (JOI19_mergers)C++20
100 / 100
412 ms49660 KiB
#include <bits/stdc++.h>

using namespace std;

int n, k, s[500001], sum[500001], f[500001], sz[500001], ans = 1;
basic_string<int> adj[500001];

int dfs(int i, int p = 0) {
    int deg = 0;
    for (int j: adj[i]) {
        if (j == p) continue;
        int d = dfs(j, i);
        deg += sz[j] ? d : 1;
        sz[i] += sz[j];
    }
    ans += not sz[i] and deg == (i == 1);
    return deg;
}

int main() {
    cin >> n >> k;
    for (int i = n; --i;) {
        int a, b;
        cin >> a >> b;
        adj[a] += b;
        adj[b] += a;
    }
    for (int i = 1; i <= n; ++i) {
        cin >> s[i];
        ++f[s[i]];
    }
    for (int i = 1; i <= n; ++i) {
        if (--f[s[i]]) sum[s[i]] += sz[i] = rand();
        else sz[i] = -sum[s[i]];
    }
    dfs(1);
    cout << ans / 2;
}
#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...