Submission #376290

#TimeUsernameProblemLanguageResultExecution timeMemory
376290tqbfjotldPapričice (COCI20_papricice)C++14
110 / 110
277 ms44264 KiB
#include <bits/stdc++.h>
using namespace std;

int sz[200005];
vector<pair<int,int> > paths[200005];
int big[200005];
int big2[200005];
int hd[200005];
vector<int> adjl[200005];
int pa[200005][20];

void dfs(int node, int p){
    pa[node][0] = p;
    for (int x = 1; x<20; x++){
        pa[node][x] = pa[pa[node][x-1]][x-1];
    }
    sz[node] = 1;
    for (auto x : adjl[node]){
        if (x==p) continue;
        dfs(x,node);
        sz[node] += sz[x];
    }
}
void decomp(int node, int p, int head){
    paths[head].push_back({-sz[node],node});
    hd[node] = head;
    int v1 = 0;
    int v2 = 0;
    big2[node] = -1; big[node] = -1;
    for (auto x : adjl[node]){
        if (x==p) continue;
        if (sz[x]>v1){
            v2 = v1;
            big2[node] = big[node];
            v1 = sz[x]; big[node] = x;
        }
        else if (sz[x]>v2){
            v2 = sz[x];
            big2[node] = x;
        }
    }
    if (big[node]!=-1)decomp(big[node],node,head);
    if (big2[node]!=-1)decomp(big2[node],node,big2[node]);
}
int n;

int getv(int a, int b){
    return max(a,max(b,n-a-b))-min(a,min(b,n-a-b));
}

int check(int node){
    //printf("checking %d\n",node);
    if (hd[node]==1){
        int remsize = n-sz[node];
        int thing = remsize/2;
        if (thing==0){
            return 999999999;
        }
        int tt = lower_bound(paths[hd[node]].begin(),paths[hd[node]].end(),make_pair(-thing-sz[node]+1,-1))-paths[hd[node]].begin();
        int splitnode = paths[hd[node]][tt-1].second;
        //printf("split1 = %d\n",splitnode);
        int t2 = -1;
        if (big2[splitnode]!=-1) t2 = lower_bound(paths[big2[splitnode]].begin(),paths[big2[splitnode]].end(),make_pair(1-thing,-1))-paths[big2[splitnode]].begin();
        if (t2==0) {
            int ans = getv(sz[node],sz[splitnode]-sz[node]);
            if (big[splitnode]!=-1 && big[splitnode]!=node)ans = min(ans,getv(sz[node],sz[big[splitnode]]-sz[node]));
            if (big2[splitnode]!=-1) ans = min(ans,getv(sz[node],sz[big2[splitnode]]));
            return ans;
        }
        if (t2==-1){
            int ans = getv(sz[node],sz[splitnode]-sz[node]);
            if (big[splitnode]!=-1 && big[splitnode]!=node)ans = min(ans,getv(sz[node],sz[big[splitnode]]-sz[node]));
            return ans;
        }
        splitnode = paths[big2[splitnode]][t2-1].second;

        //printf("split2 = %d\n",splitnode);
        int ans = getv(sz[node],sz[splitnode]);
        if (big[splitnode]!=-1) ans = min(ans,getv(sz[node],sz[big[splitnode]]));
        return ans;
    }
    else{
        int remsize = n-sz[node];
        int thing = remsize/2;
        if (thing==0){
            return 999999999;
        }
        int imptnode = node;
        for (int x = 19; x>=0; x--){
            if (pa[imptnode][x]!=0 && hd[pa[imptnode][x]]!=1){
                imptnode = pa[imptnode][x];
            }
        }
        int bef = imptnode;
        imptnode = pa[imptnode][0];
        if (sz[big[imptnode]]>=thing){
            //printf("far main branch\n");
            int t2 = lower_bound(paths[1].begin(),paths[1].end(),make_pair(1-thing,-1))-paths[1].begin();
            int splitnode = paths[1][t2-1].second;
            int ans = getv(sz[node],sz[splitnode]);
            if (big[splitnode]!=-1){
                ans = min(ans,getv(sz[node],sz[big[splitnode]]));
            }
            return ans;
        }
        //printf("near main branch\n");
        int tt = lower_bound(paths[1].begin(),paths[1].end(),make_pair(-thing-sz[node]+1,-1))-paths[1].begin();
        int splitnode = paths[1][tt-1].second;
        int ans = getv(sz[node],sz[splitnode]-sz[node]);
        if (big[splitnode]!=-1) ans = min(ans,getv(sz[node],sz[big[splitnode]]));
        if (bef!=node) ans = min(ans,getv(sz[node],sz[bef]-sz[node]));
        return ans;

    }
}

int main(){
    scanf("%d",&n);
    for (int x = 0; x<n-1; x++){
        int a,b;
        scanf("%d%d",&a,&b);
        adjl[a].push_back(b);
        adjl[b].push_back(a);
    }
    dfs(1,0);
    //printf("dfs done\n");
    decomp(1,0,1);
    //printf("decomp done\n");
    int ans = 999999999;
    for (int x = 1; x<=n; x++){
        ans = min(ans,check(x));
    }
    printf("%d",ans);
}

Compilation message (stderr)

papricice.cpp: In function 'int main()':
papricice.cpp:118:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  118 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
papricice.cpp:121:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  121 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...