Submission #1129743

#TimeUsernameProblemLanguageResultExecution timeMemory
1129743imarnPapričice (COCI20_papricice)C++20
110 / 110
355 ms93340 KiB
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vl vector<ll>
#define vvi vector<vi>
using namespace std;
const int mxn=3e5+5;
vector<int>g[mxn];
ll a[mxn];
ll ans=1e18,sum=0;
multiset<ll>ms[mxn];
void solve(int u,int p){
    for(auto v:g[u]){
        if(v==p)continue;
        solve(v,u);a[u]+=a[v];
        if(ms[u].size()<ms[v].size())swap(ms[u],ms[v]);
        for(auto it : ms[v]){
            if(ms[u].empty())break;
            auto ij=ms[u].lower_bound((sum-it)/2);
            if(ij==ms[u].end()){
                --ij;ans=min(ans,max({sum-it-*ij,it,*ij})-min({sum-it-*ij,it,*ij}));
                continue;
            }ans=min(ans,max({sum-it-*ij,it,*ij})-min({sum-it-*ij,it,*ij}));
            if(ij!=ms[u].begin()){
                ij--;ans=min(ans,max({sum-it-*ij,it,*ij})-min({sum-it-*ij,it,*ij}));ij++;
            }
            if(ij!=(--ms[u].end())){
                ij++;ans=min(ans,max({sum-it-*ij,it,*ij})-min({sum-it-*ij,it,*ij}));ij--;
            }
        }
        for(auto it : ms[v])ms[u].insert(it);
    }
    if(!ms[u].empty()){
        auto it = ms[u].lower_bound(a[u]/2);
        if(it==ms[u].end()){
            --it;ans=min(ans,max({sum-a[u],a[u]-*it,*it})-min({sum-a[u],a[u]-*it,*it}));
            ms[u].insert(a[u]);
            return;
        }ans=min(ans,max({sum-a[u],a[u]-*it,*it})-min({sum-a[u],a[u]-*it,*it}));
        if(it!=ms[u].begin()){
            it--;ans=min(ans,max({sum-a[u],a[u]-*it,*it})-min({sum-a[u],a[u]-*it,*it}));it++;
        }
        if(it!=(--ms[u].end())){
            it++;ans=min(ans,max({sum-a[u],a[u]-*it,*it})-min({sum-a[u],a[u]-*it,*it}));it--;
        }
    }ms[u].insert(a[u]);
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n;cin>>n;for(int i=1;i<=n;i++)a[i]=1,sum++;
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;g[u].pb(v);g[v].pb(u);
    }solve(1,1);cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...