Submission #1315862

#TimeUsernameProblemLanguageResultExecution timeMemory
1315862aaaaaaaaCapital City (JOI20_capital_city)C++20
11 / 100
3097 ms46552 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
const int mxN = 2e5 + 100;
const int mxB = 21;
vector<int> adj[mxN], c[mxN];
int st[mxN], sum[mxN], depth[mxN], dp[mxN][mxB], parent[mxN], seen[mxN], id[mxN], sz[mxN], dsu_par[mxN], total = 0, tin = 0;
void dfs(int u, int par){
    parent[u] = dp[u][0] = par, st[u] = ++tin, depth[u] = depth[par] + 1;
    for(int i = 1; i < mxB; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];
    for(auto it : adj[u]){
        if(it ^ par) dfs(it, u);
    }
}
int find(int u){
    return (u == dsu_par[u] ? u : dsu_par[u] = find(dsu_par[u]));
}
void unite(int u, int v){
    u = find(u), v = find(v);
    if(u == v) return;
    sz[v] += sz[u];
    dsu_par[u] = v;
}
int process(int root){
    if(seen[root] || root <= 0) return -1;
    seen[root] = 1;
    int ans = 0;
    sort(all(c[root]), [&](int x, int y){
        return st[x] < st[y];
    });
    c[root].push_back(c[root][0]);
    for(int i = 0; i < (int) c[root].size() - 1; ++i){
        int u = c[root][i], v = c[root][i + 1];
        while(1){
            if(!seen[id[u]]) ans += process(id[u]) + 1;
            if(!seen[id[v]]) ans += process(id[v]) + 1;
            if(u == v) break;
            if(depth[u] > depth[v]) u = parent[u];
            else v = parent[v];
            if(u == -1 || v == -1) break;
        }
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, k, ans = 1e9;
    cin >> n >> k;
    for(int i = 0, u, v; i < n - 1; ++i){
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i = 1, x; i <= n; ++i) {
        cin >> x;
        c[x].push_back(i);
        id[i] = x;
    }
    for(int i = 1; i <= k; ++i) dsu_par[i] = i, sz[i] = 1;
    dfs(1, -1);
    for(int i = 1; i <= k; ++i){
        ans = min(ans, process(i));
        for(int j = 1; j <= k; ++j) seen[j] = 0;
    }
    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...