Submission #1349773

#TimeUsernameProblemLanguageResultExecution timeMemory
1349773nguyenkhangninh99Unique Cities (JOI19_ho_t5)C++20
100 / 100
205 ms65924 KiB

#include<bits/stdc++.h>
using namespace std;

#define int long long
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m; cin >> n >> m;

    vector<vector<int>> adj(n + 1);
    for(int i = 1; i <= n - 1; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    vector<int> dist(n + 1), len(n + 1), res(n + 1), cnt(m + 1), c(n + 1);
    for(int i = 1; i <= n; i++) cin >> c[i];
    function<void(int, int)> dfs = [&](int u, int p){
        len[u] = 1;
        for(int v: adj[u]){
            if(v == p) continue;
            dist[v] = dist[u] + 1;
            dfs(v, u);
            len[u] = max(len[u], len[v] + 1);
        }
    };
    
    vector<int> diddy;
    int cur = 0;
    function<void(int, int)> ndfs = [&](int u, int p){
        vector<int> s;
        for(int v: adj[u]) if(v != p) s.push_back(v);
        sort(s.begin(), s.end(), [&](int x, int y){return len[x]>len[y];});

        int mx = (s.size() > 1 ? len[s[1]] : 0);
        for(int v: s){
            if(v == p) continue;
            while(diddy.size() && mx >= dist[u] - dist[diddy.back()]){
                cur -= (--cnt[c[diddy.back()]] == 0);
                diddy.pop_back();
            }

            diddy.push_back(u);
            cur += (++cnt[c[u]] == 1);
            ndfs(v, u);
            if(diddy.size() && diddy.back() == u){
                cur -= (--cnt[c[u]] == 0);
                diddy.pop_back();
            }
            mx = max(mx, len[v]);
        }   
        while(diddy.size() && mx >= dist[u] - dist[diddy.back()]){
            cur -= (--cnt[c[diddy.back()]] == 0);
            diddy.pop_back();
        }
        res[u] = max(res[u], cur);
    };
    dfs(1, 0);
    int d1 = max_element(dist.begin(), dist.end()) - dist.begin();
    dfs(d1, 0);
    ndfs(d1, 0);
    int d2 = max_element(dist.begin(), dist.end()) - dist.begin();
    dfs(d2, 0);
    ndfs(d2, 0);
    for(int i = 1; i <= n; i++) cout << res[i] << "\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...