Submission #1183270

#TimeUsernameProblemLanguageResultExecution timeMemory
1183270gubshigMergers (JOI19_mergers)C++20
0 / 100
63 ms44224 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAX_N = 500'000 + 50;

int N, K;
int S[MAX_N], Cnt[MAX_N], Dp[MAX_N];
bool IsStar[MAX_N];
map<int, int> Mp[MAX_N];
vector<int> Adj[MAX_N];

void Dfs(int v=1, int p=0) {
    if (Cnt[S[v]] > 1) Mp[v][S[v]]++;
    for (auto &nxt: Adj[v]) {
        if (nxt == p) continue;

        Dfs(nxt, v);

        Dp[v] += Dp[nxt];

        if (Mp[nxt].size() > Mp[v].size()) swap(Mp[nxt], Mp[v]);
        for (auto &[s, c]: Mp[nxt]) {
            Mp[v][s] += c;
            if (Mp[v][s] == Cnt[s]) Mp[v].erase(s);
        }
    }

    if (v != 1 && Mp[v].empty()) {
        IsStar[v] = true;
        if (Dp[v] == 0) Dp[v] = 1;
    }
}

vector<int> I;
void GetI(int v=1, int p=0) {
    if (IsStar[v]) {
        I.push_back(Dp[v]);
        return;
    }

    for (auto &nxt: Adj[v]) {
        if (nxt == p) continue;

        GetI(nxt, v);
    }
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    cin >> N >> K;
    for (int i = 0; i < N - 1; i++) {
        int u, v; cin >> u >> v;
        Adj[u].push_back(v);
        Adj[v].push_back(u);
    }

    for (int i = 1; i <= N; i++) {
        cin >> S[i];
        Cnt[S[i]]++;
    }

    Dfs();
    GetI();
    vector<vector<int>> vp(2);
    int s = 0;
    for (auto &i: I) {
        vp[i % 2].push_back(i);
        s += i;
    }

    int ans = s / 2;
    if ((vp[1].size() % 2) == 1) ans++;

    cout << ans << '\n';
}
#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...