Submission #1146359

#TimeUsernameProblemLanguageResultExecution timeMemory
1146359fzyzzz_zMeetings 2 (JOI21_meetings2)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int inf = 1e9; 

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

    int n; 
    cin >> n; 
    vector<vector<int>> g(n); 
    for (int i = 0; i < n - 1; ++i) {
        int x, y; 
        cin >> x >> y; 
        x--; y--; 
        g[x].push_back(y); 
        g[y].push_back(x); 
    }

    vector<int> best(n + 1, 0); 

    vector<set<pair<int, int>>> st(n); // {size, dist}
    vector<int> off(n); // add how much to dist 
    vector<int> ss(n, 1); 

    // which set, size to add, distance to add
    function<void(int, int, int)> upd_ans = [&] (int i, int s, int add) -> void { 
        cout << "???? " << i << ' ' << s << ' ' << add << '\n'; 

        auto it = st[i].lower_bound({s, -inf}); 
        if (it != st[i].end()) {
            int fs = min(s, (*it).first); 

            // cout << "? " << fs <<  ' ' << (*it).second + off[i] + add << '\n'; 
            best[fs] = max(best[fs], (*it).second + off[i] + add); 
        }
        if (it != st[i].begin()) {
            it--; 
            int fs = min(s, (*it).first); 
            best[fs] = max(best[fs], (*it).second + off[i] + add); 
        }
    }; 

    // set y into set x 
    function<void(int, int)> merge = [&] (int x, int y) -> void {

        cout << "MERGE | " << x << ' ' << y << '\n'; 
        if (st[x].size() < st[y].size()) {
            swap(st[x], st[y]); 
            swap(off[x], off[y]); 
            cout << "SWAP\n"; 
        }

        for (auto [sz, dist]: st[y]) {
            upd_ans(x, sz, dist + off[y]); 
        }

        for (auto [sz, dist]: st[y]) {
            dist += off[y] - off[x]; 

            auto it = st[x].lower_bound({sz, -inf}); 
            if (it != st[x].end()) {
                if ((*it).second >= dist) {
                    continue; 
                }
            }

            st[x].insert({sz, dist}); 
            while (true) {
                it = st[x].lower_bound({sz, dist}); 
                if (it == st[x].begin()) break;
                it--; 
                if ((*it).second <= dist) {
                    st[x].erase(it); 
                } else {
                    break; 
                }
            }
        }
    }; 

    auto dbg = [&] (int x) -> void {
        cout << "\nDBG ------- " << x << " -------\n"; 
        cout << "OFF " << off[x] << '\n'; 
        for (auto [z, y]: st[x]) {
            cout << z << ' ' << y << '\n'; 
        }
        cout << "\n"; 
    };

    function<void(int, int)> dfs = [&] (int x, int p) -> void {
        for (auto y: g[x]) {
            if (y != p) {
                dfs(y, x);

                ss[x] += ss[y]; 
            }
        }

        cout << "AT NODE " << x << '\n'; 

        off[x] = 0; 

        for (auto y: g[x]) {
            if (y != p) {
                merge(x, y); 
            }
        }



        off[x]++; 
        st[x].insert({ss[x], 1 - off[x]}); 
        // cout << "PAR\n"; 
        upd_ans(x, n - ss[x], 0); 

        dbg(x); 
    }; 
    dfs(0, -1); 

    for (int i = n - 1; i >= 0; --i) {
        best[i] = max(best[i], best[i + 1]); 
    }

    for (int i = 1; i <= n; ++i) {
        if (i % 2) {
            cout << 1 << '\n'; 
        } else {
            cout << best[i / 2] + 1 << '\n'; 
        }
    }

    return 0;
}
10 
1 2 
1 4 
3 4 
1 5 
2 6 
2 7 
2 8 
2 9 
3 10 

Compilation message (stderr)

meetings2.cpp:137:1: error: expected unqualified-id before numeric constant
  137 | 10
      | ^~