Submission #331847

# Submission time Handle Problem Language Result Execution time Memory
331847 2020-11-30T12:18:49 Z EndRay Mergers (JOI19_mergers) C++17
0 / 100
92 ms 25316 KB
#include<bits/stdc++.h>

using namespace std;

const int N = 5e5+1, logN = 19+1;

int n, k;
vector<int> g[N];
int s[N];
int start;
int p[logN][N], h[N];

void dfs_init(int v, int pr=-1){
    for(int u : g[v]) if(u != pr){
        p[0][u] = v;
        h[u] = h[v]+1;
        dfs_init(u, v);
    }
}

void init(int start){
    p[0][start] = 0;
    h[start] = 0;
    dfs_init(start);
    for(int d = 1; d < logN; ++d)
        for(int i = 0; i < n; ++i)
            p[d][i] = p[d-1][p[d-1][i]];
}

int lca(int u, int v){
    if(h[u] < h[v])
        swap(u, v);
    int d = h[u] - h[v];
    for(int i = 0; i < logN; ++i)
        if((d&(1<<i)))
            u = p[i][u];
    for(int i = logN-1; i >= 0; --i)
        if(p[i][u] != p[i][v]){
            u = p[i][u];
            v = p[i][v];
        }
    return (u == v ? u : p[0][u]);
}

int color_lca[N];
int ans;

pair<int, int> dfs(int v, int pr=-1){
    int w = color_lca[s[v]];
    int deg = 0;
    for(int u : g[v]) if(u != pr){
        pair<int, int> l = dfs(u, v);
        w = lca(l.first, w);
        deg += l.second;
    }
    if(v == w && v != start)
        ++deg;
    if(deg == 1)
        ++ans;
    if(v == w)
        return {w, 1};
    return {w, deg};
}

int main(){
    ios_base::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);
    cin >> n >> k;
    if(n == 2){
        cout << k-1 << "\n";
        return 0;
    }
    for(int i = 0; i < n-1; ++i){
        int u, v;
        cin >> u >> v;
        --u; --v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i = 0; i < n; ++i){
        cin >> s[i];
        --s[i];
    }
    for(int i = 0; i < n; ++i)
        if(g[i].size() > 1)
            start = i;
    init(start);
    for(int i = 0; i < k; ++i)
        color_lca[i] = -1;
    for(int i = 0; i < n; ++i){
        if(color_lca[s[i]] == -1)
            color_lca[s[i]] = i;
        color_lca[s[i]] = lca(i, color_lca[s[i]]);
    }
    dfs(start);
    cout << (ans+1)/2 << "\n";
}
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12268 KB Output is correct
2 Incorrect 9 ms 12268 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12268 KB Output is correct
2 Incorrect 9 ms 12268 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12268 KB Output is correct
2 Incorrect 9 ms 12268 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 83 ms 24932 KB Output is correct
2 Correct 92 ms 25316 KB Output is correct
3 Incorrect 12 ms 12652 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12268 KB Output is correct
2 Incorrect 9 ms 12268 KB Output isn't correct
3 Halted 0 ms 0 KB -