Submission #1215358

#TimeUsernameProblemLanguageResultExecution timeMemory
1215358duckindogMeetings 2 (JOI21_meetings2)C++20
100 / 100
167 ms39684 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 200'000 + 10;
int n;
vector<int> ad[N];

int sz[N], totalSz;

int depth[N];
int f[N][18];
int st[N], ed[N], timer;
void dfs(int u, int p = -1) { 
    st[u] = ++timer;
    sz[u] = 1;

    for (int i = 1; i <= 17; ++i) f[u][i] = f[f[u][i - 1]][i - 1];
    for (const auto& v : ad[u]) { 
        if (v == p) continue;
        depth[v] = depth[u] + 1;
        f[v][0] = u;
        dfs(v, u);
        sz[u] += sz[v];
    }

    totalSz = sz[u];
    ed[u] = timer;
}
inline bool anc(int u, int v) { return st[u] <= st[v] && ed[u] >= ed[v]; }
int lca(int u, int v) {  
    if (anc(u, v)) return u;
    if (anc(v, u)) return v;

    for (int i = 17; i >= 0; --i) 
        if (!anc(f[u][i], v)) u = f[u][i];
    return f[u][0];
}
int dist(int u, int v) { return depth[u] + depth[v] - 2 * depth[lca(u, v)]; }

int centroid(int u, int p = -1) { 
    for (const auto& v : ad[u]) { 
        if (v == p) continue;
        if (sz[v] > totalSz / 2) return centroid(v, u);
    }
    return u;
}

int answer[N];

int32_t main() { 
    cin.tie(0)->sync_with_stdio(0);

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

    int root = 1;
    dfs(root);
    root = centroid(root);
    depth[root] = 0;
    dfs(f[root][0] = root);

    vector<int> order(n); iota(order.begin(), order.end(), 1);
    sort(order.begin(), order.end(), [&](int x, int y) { 
        return sz[x] > sz[y];
    });

    int a = root, b = root, dia = 0;
    answer[n] = 1;
    for (const auto& u : order) { 
        if (u == root) continue;

        int disA = dist(a, u), disB = dist(b, u);
        if (max(disA, disB) > dia) { 
            if (disA >= disB) { 
                dia = disA;
                b = u;
            } else { 
                dia = disB;
                a = u;
            }
        }

        answer[sz[u] * 2] = max(answer[sz[u] * 2], dia + 1);
    }

    for (int i = n - 1; i >= 1; --i) {
        answer[i] = max(answer[i], answer[i + 1]);
    }
    for (int i = 1; i <= n; ++i) { 
        cout << (i & 1 ? 1 : answer[i]) << "\n"; 
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...