제출 #575896

#제출 시각아이디문제언어결과실행 시간메모리
575896eecsPapričice (COCI20_papricice)C++17
110 / 110
187 ms43308 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 200010;
int n, ans = INT_MAX, sz[maxn], fa[maxn];
vector<int> G[maxn];
set<int> V[maxn];

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n;
    for (int i = 1, u, v; i < n; i++) {
        cin >> u >> v;
        G[u].push_back(v), G[v].push_back(u);
    }
    auto chk = [&](int a, int b) {
        int c = n - a - b;
        if (a && b && c) ans = min(ans, max({a, b, c}) - min({a, b, c}));
    };
    auto dfs = [&](auto self, int u) -> void {
        sz[u] = 1;
        for (int v : G[u]) if (v ^ fa[u]) {
            fa[v] = u, self(self, v), sz[u] += sz[v];
            vector<int> V1, V2;
            auto it = V[u].upper_bound(n / 3);
            if (it != V[u].end()) V1.push_back(*it);
            if (it != V[u].begin()) V1.push_back(*prev(it));
            it = V[v].upper_bound(n / 3);
            if (it != V[v].end()) V2.push_back(*it);
            if (it != V[v].begin()) V2.push_back(*prev(it));
            for (int x : V1) for (int y : V2) chk(x, y);
            if (V[u].size() < V[v].size()) swap(V[u], V[v]);
            for (int x : V[v]) V[u].insert(x);
        }
        V[u].insert(sz[u]);
        auto it = V[u].lower_bound(sz[u] / 2);
        chk(*it, sz[u] - *it);
        if (it != V[u].begin()) chk(*prev(it), sz[u] - *prev(it));
    };
    dfs(dfs, 1);
    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...