Submission #1293467

#TimeUsernameProblemLanguageResultExecution timeMemory
1293467IcelastMeetings 2 (JOI21_meetings2)C++20
100 / 100
679 ms31976 KiB
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
template <class T>
struct Fenwick {
    int n, log;
    vector<T> bit;
    Fenwick(int n) : n(n), log(32 - __builtin_clz(n + 1)), bit(n + 1, 0) {}

    void add(int i, T delta) {
        for (; i <= n; i += i & -i) {
            bit[i] = max(bit[i], delta);
        }
    }

    T sum(int i) {
        T res = 0;
        for (; i > 0; i -= i & -i) {
            res = max(res, bit[i]);
        }
        return res;
    }
};
vector<int> res;
struct CentroidTree{
    int n;
    vector<int> pa;
    CentroidTree(int n, vector<vector<int>> &adj) : n(n){
        pa.resize(n+1, -1);
        vector<bool> ban(n+1, false);
        vector<int> sub(n+1), sub2(n+1);
        int tree_size;
        auto rt = [&](auto rt, int u, int p) -> void{
            sub[u] = 1;
            for(int v : adj[u]){
                if(v == p || ban[v]) continue;
                rt(rt, v, u);
                sub[u]+=sub[v];
            }
        };
        auto find = [&](auto find, int u, int p) -> int{
            for(int v : adj[u]){
                if(v == p || ban[v]) continue;
                if(sub[v]*2 > tree_size){
                    return find(find, v, u);
                }
            }
            return u;
        };

        auto build = [&](auto build, int u, int p) -> void{
            rt(rt, u, u);
            tree_size = sub[u];
            int c = find(find, u, u);
            ban[c] = true;
            pa[c] = p;
            Fenwick<int> bit(tree_size);
            vector<pair<int, int>> to_del, vv;
            auto dfs = [&](auto dfs, int u, int p, int len) -> void{
                sub2[u] = 1;
                for(int v : adj[u]){
                    if(v == p || ban[v]) continue;
                    dfs(dfs, v, u, len+1);
                    sub2[u] += sub2[v];
                }
                vv.push_back({tree_size+1 - sub2[u], len});
                int mx = bit.sum(tree_size+1 - sub2[u]);
                if(mx > 0) res[sub2[u]*2] = max(res[sub2[u]*2], mx+len+1);


            };
            for(int v : adj[c]){
                if(ban[v]) continue;
                vv.clear();
                dfs(dfs, v, c, 1);
                int szA = tree_size - sub2[v];
                for(auto it : vv){
                    bit.add(it.first, it.second);
                    int sz = tree_size+1 - it.first;
                    int mn = min(sz, szA);
                    res[mn*2] = max(res[mn*2], it.second+1);
                }
            }
            for(int i = 1; i <= tree_size; i++){
                bit.bit[i] = 0;
            }
            for(int i = adj[c].size()-1; i >= 0; i--){
                int v = adj[c][i];
                if(ban[v]) continue;
                vv.clear();
                dfs(dfs, v, c, 1);
                for(auto it : vv){
                    bit.add(it.first, it.second);
                }
            }
            for(int v : adj[c]){
                if(ban[v]) continue;
                build(build, v, c);
            }
        };
        build(build,  1, 0);
    };
};
void solve(){
    int n;
    cin >> n;
    vector<vector<int>> adj(n+1);
    for(int i = 1; i < n; i++){
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    res.resize(n+1, 0);
    CentroidTree(n, adj);
    vector<int> ans(n+1);
    int mx = 1;
    for(int i = n; i >= 1; i--){
        mx = max(mx, res[i]);
        if(i&1){
            ans[i] = 1;
            continue;
        }
        ans[i] = mx;
    }
    for(int i = 1; i <= n; i++){
        cout << ans[i] << "\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...