#include<bits/stdc++.h>
#define taskname "D"
using namespace std;
template<class T>void minimize(T& a, T b){
if(a > b){
a = b;
}
}
template<class T>void maximize(T& a, T b){
if(a < b){
a = b;
}
}
const int lim = 2e5 + 5;
vector<int>g[lim];
int n, u[lim], v[lim];
namespace sub1{
const int lim = 205;
int cnt;
bitset<lim>vis;
void dfs(int s, const int& i1, const int& i2){
cnt++;
vis.set(s);
for(int& i : g[s]){
if(i != i1 && i != i2){
int d = u[i] ^ v[i] ^ s;
if(!vis.test(d)){
dfs(d, i1, i2);
}
}
}
}
void solve(){
int ans = n;
for(int i = 1; i < n; i++){
for(int j = i + 1; j < n; j++){
vis.reset();
int max_cnt = 0, min_cnt = n;
for(int k = 1; k <= n; k++){
if(!vis.test(k)){
cnt = 0;
dfs(k, i, j);
minimize(min_cnt, cnt);
maximize(max_cnt, cnt);
}
}
minimize(ans, max_cnt - min_cnt);
}
}
cout << ans;
}
}
namespace sub23{
set<int>S[lim];
int ans = INT_MAX, cnt[lim];
void dfs_1(int s, int p = -1){
cnt[s] = 1;
for(int& i : g[s]){
int d = u[i] ^ v[i] ^ s;
if(d != p){
dfs_1(d, s);
cnt[s] += cnt[d];
}
}
}
void update(int other, set<int>& S){
int remain = n - other;
auto it = S.upper_bound(remain >> 1);
if(it != S.end()){
minimize(ans, max(other, *it) - min(other, remain - *it));
}
if(it != S.begin()){
it = prev(it);
minimize(ans, max(other, remain - *it) - min(other, *it));
}
}
void dfs_2(int s, int p = -1){
for(int& i : g[s]){
int d = u[i] ^ v[i] ^ s;
if(d != p){
dfs_2(d, s);
if(S[s].size() < S[d].size()){
swap(S[s], S[d]);
}
for(const int& x : S[d]){
update(x, S[s]);
}
for(const int& x : S[d]){
S[s].insert(s);
}
}
}
update(n - cnt[s], S[s]);
}
void solve(){
dfs_1(1);
dfs_2(1);
cout << ans;
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
cin >> n;
for(int i = 1; i < n; i++){
cin >> u[i] >> v[i];
g[u[i]].emplace_back(i);
g[v[i]].emplace_back(i);
}
if(n <= 200){
sub1::solve();
}
else{
sub23::solve();
}
}
Compilation message (stderr)
papricice.cpp: In function 'int main()':
papricice.cpp:104:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
104 | freopen(taskname".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |