Submission #217212

#TimeUsernameProblemLanguageResultExecution timeMemory
217212DodgeBallManCapital City (JOI20_capital_city)C++14
100 / 100
1102 ms41208 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5+5;

int n, k, ans = 1e9;
int C[N], cnt[N];
vector<int> g[N];

int sz[N];
bitset<N> chk;

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

int find_cen(int u, int p, int all, int &ret) {
    int mx = all - sz[u];
    for(int v : g[u]) if(v != p && !chk[v])
        mx = max(mx, find_cen(v, u, all, ret));
    if(mx <= (all + 1) / 2) ret = u;
    return sz[u];
}

int par[N], used[N];
vector<int> col[N];
queue<int> Q;

void dfs(int u, int p, bool fill) {
    if(fill) col[C[u]].emplace_back(u), par[u] = p;
    else col[C[u]].clear(), used[C[u]] = 0;
    for(int v : g[u]) if(v != p && !chk[v])
        dfs(v, u, fill);
}

void process(int u) {
    get_sz(u, u), find_cen(u, u, sz[u], u);
    dfs(u, 0, 1);

    int ret = 1;
    bool valid = true;
    Q.emplace(C[u]), used[C[u]] = 1;
    while(!Q.empty()) {
        int now = Q.front(); Q.pop();
        if(col[now].size() != cnt[now]) { valid = false; break; }
        for(int x : col[now]) if(x != u && !used[C[par[x]]]) {
            used[C[par[x]]] = 1, ++ret;
            Q.emplace(C[par[x]]);
        }
    }
    if(valid) ans = min(ans, ret);

    dfs(u, 0, 0), chk[u] = 1;
    for(int v : g[u]) if(!chk[v]) process(v); 
}

int main() {
    scanf("%d %d", &n, &k);
    for(int i = 1, a, b; i < n; i++) {
        scanf("%d %d", &a, &b);
        g[a].emplace_back(b), g[b].emplace_back(a);
    }
    for(int i = 1; i <= n; i++) scanf("%d", C + i), ++cnt[C[i]];
    process(1);

    printf("%d\n", ans - 1);

    return 0;
}

Compilation message (stderr)

capital_city.cpp: In function 'void process(int)':
capital_city.cpp:49:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(col[now].size() != cnt[now]) { valid = false; break; }
            ~~~~~~~~~~~~~~~~^~~~~~~~~~~
capital_city.cpp: In function 'int main()':
capital_city.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &n, &k);
     ~~~~~^~~~~~~~~~~~~~~~~
capital_city.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~~
capital_city.cpp:67:51: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i = 1; i <= n; i++) scanf("%d", C + i), ++cnt[C[i]];
                                 ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...