CF685B Kay and Snowflake(重心性质)

一个子树的重心一定是在子树的重儿子与当前根的路径上

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e6+10;
int h[N],ne[N],e[N],idx;
int ans[N],sz[N];
int son[N];
int p[N];
int n,q;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
    sz[u]=1;
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(j==fa)
            continue;
        dfs(j,u);
        sz[u]+=sz[j];
        if(sz[j]>sz[son[u]]){
            son[u]=j;
        }
    }
    if(sz[son[u]]*2>sz[u]){
        int res=ans[son[u]];
        while((sz[u]-sz[res])*2>sz[u])
            res=p[res];
        ans[u]=res;
    }
    else{
        ans[u]=u;
    }
}
int main(){
    ios::sync_with_stdio(false);
    memset(h,-1,sizeof h);
    int i;
    cin>>n>>q;
    for(int i=2;i<=n;i++){
        int a;
        cin>>a;
        p[i]=a;
        add(i,a);
        add(a,i);
    }
    dfs(1,-1);
    while(q--){
        int x;
        cin>>x;
        cout<<ans[x]<<endl;
    }
}
View Code

 

posted @ 2020-10-19 23:38  朝暮不思  阅读(155)  评论(0编辑  收藏  举报