rt,sub 3 全部 TLE,不知道什么原因
//LuoFeng Nanami ver.
#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i, a, b) for(rll i = a; i <= b; i++)
#define Fdn(i, a, b) for(rll i = a; i >= b; i--)
#define pii pair<int, int>
#define fi first
#define se second
using namespace std;
const int inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7, _mod = 998244353;
const int maxn = 2e5 + 7;
int n;
int siz[maxn];
vector<int> G[maxn];
inline void init(int u, int fa) {
siz[u] = 1;
for(int v : G[u]) {
if(v == fa) continue ;
init(v, u); siz[u] += siz[v];
}
}
multiset<int> s1, s2; // s1 to root, s2 other
int ans = inf;
inline void solve(int u, int fa) {
if(!s1.empty()) {
auto p1 = lower_bound(s1.begin(), s1.end(), siz[u] + (n - siz[u]) / 2);
if(p1 != s1.end()) {
int a = siz[u], b = *p1 - siz[u], c = n - a - b;
ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
}
if(p1 != s1.begin()) {
p1--;
int a = siz[u], b = *p1 - siz[u], c = n - a - b;
ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
}
}
if(!s2.empty()) {
auto p2 = lower_bound(s2.begin(), s2.end(), (n - siz[u]) / 2);
if(p2 != s2.end()) {
int a = siz[u], b = *p2, c = n - a - b;
ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
}
if(p2 != s2.begin()) {
p2--;
int a = siz[u], b = *p2, c = n - a - b;
ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
}
}
if(u != 1) s1.insert(siz[u]);
for(int v : G[u]) if(v != fa) solve(v, u);
if(u != 1) s1.erase(s1.find(siz[u])), s2.insert(siz[u]);
}
signed main() {
//freopen("glz.in", "r", stdin);
// freopen("glz.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
F(i, 1, n - 1) {
int u, v; cin >> u >> v;
G[u].push_back(v), G[v].push_back(u);
}
init(1, 0);
solve(1, 0);
cout << ans;
return 0;
}