제출 #1327751

#제출 시각아이디문제언어결과실행 시간메모리
1327751spetrMeetings 2 (JOI21_meetings2)C++20
100 / 100
268 ms50956 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
const ll mmod = 998244353;  
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>

vll graf;
vl depth;
ll root = -1;
vl sizes;
vl tour;
vl vyskyt;
vl tree;

void dfs1 (ll v, ll p){
    ll s = 1;
    for (auto x: graf[v]){
        if (x != p){
            dfs1(x, v);
            s += sizes[x];
        }
    }
    sizes[v] = s;
    ll n = graf.size();
    if (s*2 >= n && root == -1){
        root = v;
    }
}

void dfs2 (ll v, ll p, ll d){
    ll s = 1;
    for (auto x: graf[v]){
        if (x != p){
            dfs2(x, v, d+1);
            s += sizes[x];
        }
    }
    sizes[v] = s;
    depth[v] = d;
}

void gettour(ll v, ll p){
    tour.push_back(v);
    for (auto x : graf[v]){
        if (x != p){
            gettour(x, v);
            tour.push_back(v);
        }
    }
}

void build(ll l, ll r, ll i){
    if (l == r){
        if (l < tour.size()){
            tree[i] = depth[tour[l]];
        }
        return;
    }
    ll mid = (l+r)/2;
    build(l ,mid, 2*i);
    build(mid+1,r,2*i+1);
    tree[i] = min(tree[2*i], tree[2*i+1]);
    return;
}

ll query(ll l, ll r, ll L, ll R, ll i){
    if (L <= l && r <= R){
        return tree[i];
    }
    if (r < L || R < l){
        return 2e18;
    }
    ll mid = (l+r)/2;
    ll a = query(l, mid, L, R, 2*i);
    ll b = query(mid+1, r, L, R, 2*i+1);
    return min(a,b);
}

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

    ll n;
    cin >>n;
    graf.resize(n);

    for (ll i = 0; i <n-1; i++){
        ll a,b;
        cin >> a >>b;
        a--; b--;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    sizes.resize(n ,0);
    dfs1(0, -1);
    depth.resize(n, 0);
    sizes.clear(); sizes.resize(n, 0);
    dfs2(root, -1, 0);

    gettour(root, -1);

    vyskyt.resize(n , -1);
    for (ll i = 0; i < tour.size(); i++){
        if (vyskyt[tour[i]] == -1){
            vyskyt[tour[i]] = i;
        }
    }

    ll k = 1;
    while (k < tour.size()){
        k *= 2;
    }

    tree.resize(4*k+4, 0);
    build(0, k-1, 1);

    vector<pl> q;
    for (ll i = 0; i < n; i++){
        q.push_back({sizes[i], i});
    }
    sort(q.begin(), q.end()); reverse(q.begin(), q.end());

    vl ans(n+1, 0);
    ll d = 0;
    ll u = root; ll v = root;
    ll j = 0;
    for (ll i = n; i>=1; i--){
        if (i % 2 == 1){
            ans[i] = 1;
        }
        else{
            while (j < q.size() && q[j].first >= i/2){
                ll prvek = q[j].second;
                j++;
                ll a,b;
                a = min(vyskyt[u], vyskyt[prvek]); b = max(vyskyt[u], vyskyt[prvek]);
                ll lca1 = query(0, k-1, a , b, 1);
                ll d1 = depth[prvek] + depth[u] - 2*lca1;

                a = min(vyskyt[v], vyskyt[prvek]); b = max(vyskyt[v], vyskyt[prvek]);
                ll lca2 = query(0, k-1, a, b, 1);
                ll d2 = depth[prvek] + depth[v] - 2*lca2;
                if (d1 < d2){
                    swap(d1, d2);
                    swap(u, v);
                }
                if (d1 > d){
                    d = d1;
                    v = prvek;
                }
            }
            ans[i] = d+1;
        }
    }
    for (ll i = 1; i<= n; i++){
        cout << ans[i] << "\n";
    }

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