Submission #479553

#TimeUsernameProblemLanguageResultExecution timeMemory
479553kakayoshiPapričice (COCI20_papricice)C++14
110 / 110
217 ms21444 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> pi;
typedef pair<ll, pair<ll, ll> > pii;
typedef vector <ll> vi;
#define forw(i,a,b) for (ll i=a;i<=(b);i++)
#define forb(i,a,b) for (ll i=a;i>=(b);i--)
#define fast {ios::sync_with_stdio(false); cin.tie(0); }
#define fi first
#define se second
#define pu push
#define puf push_front
#define pb push_back
#define pof pop_front
#define pob pop_back
#define fr front
#define all(a) a.begin(),a.end()
const ll oo=1e18;
const ll mod=1e9+7;
const int base=31;
const int tx[4]={0,0,1,-1};
const int ty[4]={1,-1,0,0};
const ll maxN=2e5+5;
int n,sum[maxN],ans;
set<int> a,b;
vector <int> check[maxN];
int build(int u, int father) // build subtree
{
    sum[u]=1;
    for(int v:check[u])
    if (v!=father)
        sum[u]+=build(v,u);
    return sum[u];
}
void dfs(int u, int father)
{
    // set A: save current ancestors of u
    // set B: save others
    // case 1: v is an ancestor of u
    // => | (sum[v] - sum[u]) - (n-sum[v]) |  : is as small as possible
    // => | sum[v] - (n+sum[u])/2 |
    int x=(n+sum[u])/2;
    auto it=a.lower_bound(x);
    if (it!=a.end())
        ans=min(ans,max(sum[u],max(n-(*it),(*it)-sum[u]))-min(sum[u],min(n-(*it),(*it)-sum[u])));
    if (it!=a.begin())
    {
        it--;
        ans=min(ans,max(sum[u],max(n-(*it),(*it)-sum[u]))-min(sum[u],min(n-(*it),(*it)-sum[u])));
    }
    // case 2: v is not an ancestor of u
    // => | (n- sum[u] - sum[v]) - sum[v] |
    // => | (n-sum[u])/2 - sum[v] |
    x=(n-sum[u])/2;
    it=b.lower_bound(x);
    if (it!=b.end())
        ans=min(ans,max(sum[u],max(n-(*it)-sum[u],(*it)))-min(sum[u],min(n-(*it)-sum[u],(*it))));
    if (it!=b.begin())
    {
        it--;
        ans=min(ans,max(sum[u],max(n-(*it)-sum[u],(*it)))-min(sum[u],min(n-(*it)-sum[u],(*it))));
    }
    a.insert(sum[u]);
    for(int v:check[u])
    if (v!=father)
        dfs(v,u);
    a.erase(sum[u]);
    b.insert(sum[u]);
    return;
}
void solve()
{
    cin>>n;
    forw(i,1,n-1)
    {
        int u,v;
        cin>>u>>v;
        check[u].pb(v);
        check[v].pb(u);
    }
    int s=0;
    forw(i,1,n)
    if (check[i].size()==1)
    {
        s=i;
        break;
    }
    ans=1e9;
    build(s,0);
    //cout<<"finish"<<endl;
    dfs(s,0);
    cout<<ans;
}
int main()
{
    fast;
    //freopen("test.inp","r",stdin);
    //freopen("test.out","w",stdout);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...