제출 #512634

#제출 시각아이디문제언어결과실행 시간메모리
512634couplefireMergers (JOI19_mergers)C++17
100 / 100
922 ms137568 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 500005;

int n, k;
vector<int> states[N];
vector<int> adj[N];
int tin[N], tout[N], tid;
int up[N][20], dif[N];
int cnt[N], ans, huh[N];

void dfs1(int v, int p){
    up[v][0] = p;
    for(int i = 1; i<20; ++i)
        up[v][i] = up[up[v][i-1]][i-1];
    tin[v] = ++tid;
    for(auto u : adj[v])
        if(u!=p) dfs1(u, v);
    tout[v] = tid;
}

bool is_fa(int u, int v){
    return tin[u]<=tin[v] && tout[v]<=tout[u];
}

int lca(int u, int v){
    if(is_fa(u, v)) return u;
    if(is_fa(v, u)) return v;
    for(int i = 19; i>=0; --i)
        if(!is_fa(up[u][i], v)) 
            u = up[u][i];
    return up[u][0];
}

int dfs2(int v, int p){
    int sum = dif[v];
    for(auto u : adj[v]){
        if(u==p) continue;
        sum += dfs2(u, v);
        cnt[v] += cnt[u];
    }
    huh[v] = sum;
    if(v==0) return sum;
    cnt[v] += (sum==0);
    if(sum==0 && cnt[v]==1)
        ++ans;
    return sum;
}

int main(){
    // freopen("a.in", "r", stdin);
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> k;
    for(int i = 0; i<n-1; ++i){
        int u, v; cin >> u >> v;
        --u; --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i = 0; i<n; ++i){
        int x; cin >> x; --x;
        states[x].push_back(i);
    }
    dfs1(0, 0);
    for(int i = 0; i<k; ++i){
        int top = states[i][0];
        for(auto v : states[i])
            top = lca(top, v);
        for(auto v : states[i])
            ++dif[v], --dif[top];
    }
    dfs2(0, 0);
    for(int i = 1; i<n; ++i)
        if(huh[i]==0 && cnt[i]==cnt[0])
            ++ans;
    cout << (ans+1)/2 << '\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...