Submission #1336345

#TimeUsernameProblemLanguageResultExecution timeMemory
1336345MisterReaperMeetings 2 (JOI21_meetings2)C++20
100 / 100
259 ms41852 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG
    #include "debug.h"
#else
    #define debug(...) void(23)
#endif

template<typename T>
bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    if (N == 1) {
        std::cout << "1\n";
        return 0;
    }

    std::vector<int> U(N), V(N);
    std::vector<std::vector<int>> adj(N);
    for (int i = 1; i < N; ++i) {
        std::cin >> U[i] >> V[i];
        --U[i], --V[i];
        adj[U[i]].emplace_back(i);
        adj[V[i]].emplace_back(i);
    }

    std::vector<int> ans(N / 2 + 1, 1);

    int cen;
    [&] {
        std::vector<int> siz(N, 1);
        auto dfs = [&](auto&& self, int v, int pr) -> void {
            for (auto e : adj[v]) {
                int u = U[e] ^ V[e] ^ v;
                if (u == pr) {
                    continue;
                }
                self(self, u, v);
                siz[v] += siz[u];
            }
        };
        dfs(dfs, 0, -1);
        int v = 0, par = -1;
        while (true) {
            bool ch = false;
            for (auto e : adj[v]) {
                int u = U[e] ^ V[e] ^ v;
                if (u == par) {
                    continue;
                }
                if (siz[u] * 2 > N) {
                    par = v;
                    v = u;
                    ch = true;
                    break;
                }
            }
            if (!ch) {
                break;
            }
        }
        cen = v;
    }();

    std::vector<int> siz(N, 1), dep(N), par(N);
    auto dfs = [&](auto&& self, int v) -> void {
        for (auto e : adj[v]) {
            int u = U[e] ^ V[e] ^ v;
            if (u == par[v]) {
                continue;
            }
            dep[u] = dep[v] + 1;
            par[u] = v;
            self(self, u);
            chmax(ans[siz[u]], dep[u] + 1);
            siz[v] += siz[u];
        }
    };
    par[cen] = cen;
    dfs(dfs, cen);

    const int LG = std::__lg(N);

    std::vector<std::vector<int>> lift(LG + 1, std::vector<int>(N));
    for (int i = 0; i < N; ++i) {
        lift[0][i] = par[i];
    }
    for (int i = 0; i < LG; ++i) {
        for (int j = 0; j < N; ++j) {
            lift[i + 1][j] = lift[i][lift[i][j]];
        }
    }

    auto lca = [&](int u, int v) -> int {
        if (dep[u] < dep[v]) {
            std::swap(u, v);
        }
        for (int i = LG; i >= 0; --i) {
            if (dep[u] - (1 << i) >= dep[v]) {
                u = lift[i][u];
            }
        }
        if (u == v) {
            return u;
        }
        for (int i = LG; i >= 0; --i) {
            if (lift[i][u] != lift[i][v]) {
                u = lift[i][u];
                v = lift[i][v];
            }
        }
        return lift[0][u];
    };
    auto dist = [&](int a, int b) -> int {
        return dep[a] + dep[b] - 2 * dep[lca(a, b)];
    };

    std::vector<std::vector<int>> all(N / 2 + 1);
    for (int i = 0; i < N; ++i) {
        if (i != cen) {
            all[siz[i]].emplace_back(i);
        }
    }

    int x = cen, y = cen;
    for (int i = N / 2; i >= 1; --i) {
        for (auto j : all[i]) {
            if (dist(x, y) < dist(x, j)) {
                std::swap(y, j);
            }
            if (dist(x, y) < dist(j, y)) {
                std::swap(x, j);
            }
        }
        chmax(ans[i], dist(x, y) + 1);
    }

    for (int i = 1; i <= N; ++i) {
        if (i % 2 == 0) {
            std::cout << ans[i / 2] << '\n';
        } else {
            std::cout << "1\n";
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...