제출 #1370867

#제출 시각아이디문제언어결과실행 시간메모리
1370867SpyrosAlivMeetings 2 (JOI21_meetings2)C++20
20 / 100
76 ms11608 KiB
#include <bits/stdc++.h>
using namespace std;

const int MN = 4005;

int n;
bool rem[MN];
int sz[MN], deg[MN];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> leaves;
vector<vector<int>> tree;

pair<int, int> max_dis(int node, int prev = 0) {
    if (rem[node]) return {-10, -10};
    pair<int, int> cand = {node, 1};
    for (auto next: tree[node]) {
        if (next == prev) continue;
        pair<int, int> might = max_dis(next, node);
        might.second++;
        if (might.second > cand.second) cand = might;
    }
    return cand;
}

int get_diam() {
    int st = -1;
    for (int i = 1; i <= n; i++) {
        if (!rem[i]) st = i;
    }
    if (st == -1) return 1;
    int end1 = max_dis(st).first;
    return max_dis(end1).second;
}

void remove_nodes(int b) {
    while (!leaves.empty() && leaves.top().first < b) {
        int curr = leaves.top().second;
        rem[curr] = true;
        leaves.pop();
        for (auto next: tree[curr]) {
            if (rem[next]) continue;
            sz[next] += sz[curr];
            deg[next]--;
            if (deg[next] == 1) {
                leaves.push({sz[next], next});
            }
        }
    }
}

void solve() {
    cin >> n;
    tree.resize(n+1);
    for (int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
    for (int i = 1; i <= n; i++) {
        sz[i] = 1;
        deg[i] = tree[i].size();
    }
    for (int i = 1; i <= n; i++) {
        if (deg[i] == 1) leaves.push({sz[i], i});
    }
    int diam = get_diam();
    for (int k = 1; k <= n; k++) {
        if (k & 1) {
            cout << 1 << "\n";
        }
        else {
            remove_nodes(k / 2);
            int ans = get_diam();
            cout << ans << "\n";
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…