Submission #682031

#TimeUsernameProblemLanguageResultExecution timeMemory
682031ParsaSMergers (JOI19_mergers)C++17
100 / 100
1141 ms102928 KiB
// In the name of God
//-MILY-
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define mp make_pair
typedef long long ll;
const int N = 5e5 + 5;
int n, k;
vector<int> adj[N], vec[N];
int mn[N], tin[N], tout[N], T;
int ans, h[N], cnt, c[N];
bool vis[N], mark[N];

void dfs(int v, int p) {
    tin[v] = ++T;
    for (auto u : adj[v]) {
        if (u == p)
            continue;
        dfs(u, v);
    }
    tout[v] = ++T;
}
void dfs2(int v, int p) {
    vis[v] = true;
    mn[v] = h[v];
    bool tmp = false;
    for (auto u : adj[v]) {
        if (!vis[u]) {
            h[u] = h[v] + 1;
            dfs2(u, v);
            if (mn[u] > h[v]) {
                mark[u] = true;
                cnt++;
            }
            mn[v] = min(mn[v], mn[u]);
        }
        else if (u != p || tmp) {
            mn[v] = min(mn[v], h[u]);
        }
        if (u == p)
            tmp = true;
    }
}
void dfs3(int v) {
    vis[v] = true;
    for (auto u : adj[v]) {
        if (!vis[u]) {
            dfs3(u);
            c[v] += c[u];
            if (mark[u])
                c[v]++;
        }
    }
    ans += mark[v] && (c[v] == 0 || c[v] == cnt - 1);
}

void solve() {
    cin >> n >> k;
    for (int i = 0; i < n - 1; i++) {
        int v, u; cin >> v >> u;
        adj[v].pb(u), adj[u].pb(v);
    }
    for (int i = 1; i <= n; i++) {
        int s; cin >> s;
        vec[s].pb(i);
    }
    dfs(1, 0);
    for (int i = 1; i <= k; i++) {
        vector<pair<int, int> > V;
        for (auto v : vec[i]) {
            V.pb(mp(tin[v], v));
        }
        sort(V.begin(), V.end());
        for (int i = 0; i < (int)V.size(); i++) {
            int j = (i + 1) % (int)V.size();
            adj[V[i].se].pb(V[j].se);
            adj[V[j].se].pb(V[i].se);
        }
    }
    dfs2(1, 0);
    memset(vis, 0, sizeof vis);
    dfs3(1);
    cout << (ans + 1) / 2 << '\n';
}
int32_t main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    solve();
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...