Submission #1176436

#TimeUsernameProblemLanguageResultExecution timeMemory
1176436nguyenkhangninh99Papričice (COCI20_papricice)C++20
110 / 110
169 ms39032 KiB

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
vector<int> g[maxn];
int sz[maxn];
set<int> s[maxn];
int n, ans = 1e9;

void dfssz(int u, int p){
    sz[u] = 1;
    for(int v: g[u]){
        if (v == p) continue;
        dfssz(v, u);
        sz[u] += sz[v];
    }
}

void dfs(int u, int p){
    for(int v: g[u]){
        if (v == p) continue;
        dfs(v, u);
        if (s[u].size() < s[v].size()) swap(s[u], s[v]);
        for(int x: s[v]) {
            auto it = s[u].lower_bound((n - x) / 2);
            if(it != s[u].end()) ans = min(ans, max({*it, n - *it - x, x}) - min({*it, n - *it - x, x}));
            --it;
            if(it != s[u].begin()) ans = min(ans, max({*it, n - *it - x, x}) - min({*it, n - *it - x, x}));
        }
        for(int x: s[v]) s[u].insert(x); 
    }

    if (!s[u].empty()){
        auto it = s[u].lower_bound(sz[u] / 2);
        if(it != s[u].end()) ans = min(ans, max({*it, sz[u] - *it, n - sz[u]}) - min({*it, sz[u] - *it, n - sz[u]}));
        --it;
        if(it != s[u].begin()) ans = min(ans, max({*it, sz[u] - *it, n - sz[u]}) - min({*it, sz[u] - *it, n - sz[u]}));
    }

    s[u].insert(sz[u]);
}

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

    dfssz(1, 0);
    dfs(1, 0);
    cout << ans;
}

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

    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...