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; } }
没有人不辛苦,只有人不喊疼