Submission #367452

#TimeUsernameProblemLanguageResultExecution timeMemory
367452valerikk수도 (JOI20_capital_city)C++17
100 / 100
1063 ms39520 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

const int MXN = 2e5 + 7;

int n, k;
vector<int> ed[MXN];
int c[MXN], tot[MXN], sz[MXN], ans = MXN;
bool del[MXN], used[MXN];
vector<int> nodes;
bool usedc[MXN];
vector<int> cc[MXN];
int pp[MXN];

int get_sz(int v, int p = -1) {
    sz[v] = 1;
    for (int u : ed[v]) {
        if (u != p && !del[u]) sz[v] += get_sz(u, v);
    }
    return sz[v];
}

int cent(int v, int nn, int p = -1) {
    for (int u : ed[v]) {
        if (u != p && !del[u] && 2 * sz[u] > nn) return cent(u, nn, v);
    }
    return v;
}

void dfs(int v, int p = -1) {
    pp[v] = p;
    nodes.pb(v);
    used[v] = usedc[c[v]] = 0;
    cc[c[v]].pb(v);
    for (int u : ed[v]) {
        if (u != p && !del[u]) dfs(u, v);
    }
}

void solve(int v) {
    get_sz(v);
    nodes.clear();
    dfs(v);
    queue<int> q;
    q.push(c[v]);
    used[v] = usedc[c[v]] = 1;
    int need = 0;
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int u : cc[x]) {
            int vv = u;
            while (!used[vv]) {
                used[vv] = 1;
                if (!usedc[c[vv]]) {
                    need++;
                    usedc[c[vv]] = 1;
                    q.push(c[vv]);
                }
                vv = pp[vv];
            }
        }
    }
    bool ok = 1;
    for (int u : nodes) {
        if (used[u]) ok &= cc[c[u]].size() == tot[c[u]];
    }
    for (int u : nodes) cc[c[u]].clear();
    if (ok) ans = min(ans, need);
    del[v] = 1;
    for (int u : ed[v]) {
        if (!del[u]) solve(cent(u, sz[u]));
    }
}   



int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    for (int i = 0; i < n - 1; i++) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        ed[a].pb(b);
        ed[b].pb(a);
    }
    for (int i = 0; i < n; i++) {
        cin >> c[i];
        c[i]++;
        tot[c[i]]++;
    }
    solve(cent(0, get_sz(0)));
    cout << ans << endl;
    return 0;
}

Compilation message (stderr)

capital_city.cpp: In function 'void solve(int)':
capital_city.cpp:68:44: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   68 |         if (used[u]) ok &= cc[c[u]].size() == tot[c[u]];
      |                            ~~~~~~~~~~~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...