记录编号 425257 评测结果 AAAAAAAAAAAAA
题目名称 [USACO Hol10] 政党 最终得分 100
用户昵称 GravatarTroywar 是否通过 通过
代码语言 C++ 运行时间 0.497 s
提交时间 2017-07-14 21:46:03 内存使用 21.10 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
void read(int &x){
    x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')   ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
}
const int N=200020;
std::vector<int> hollo[N];
int n,k, head[N],all;
struct DATA{
	int v,last;
}edge[N];
void push(int u,int v){
	edge[++all].v=v;
	edge[all].last=head[u];
	head[u]=all;
}
bool vis[N];int f[N][20],deep[N];
std::queue<int > q;
void bfs(){
    q.push(0);vis[0]=true;
    while(!q.empty()){
        int u=q.front();q.pop();
	    for(int i=1;(1<<i)<=deep[u];i++){
		    f[u][i]=f[f[u][i-1]][i-1];
    	}
	    for(int i=head[u];i;i=edge[i].last){
		    int v=edge[i].v;
    		if(vis[v])continue;
		    deep[v]=deep[u]+1;
	    	f[v][0]=u;
            q.push(v);
    	}
    }
}
int lca(int x,int y){
	if(deep[x]<deep[y])
		x^=y,y^=x,x^=y;
	int t=deep[x]-deep[y];
	for(int i=0;(1<<i)<=t;i++)
		if(t&(1<<i))	x=f[x][i];
	if(x==y)return x;
	for(int i=10;i>=0;i--){
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	}return f[x][0];
}
int main(){
	freopen("cowpol.in","r",stdin);
	freopen("cowpol.out","w",stdout);
	read(n),read(k);
	int pi,ai;
	for(int i=1;i<=n;i++){
		read(ai),read(pi);
		hollo[ai].push_back(i);
		push(pi,i);
	}
    deep[0]=1;bfs();
	for(int i=1;i<=k;i++){
        int u;
        int dep=0;
		int maxn=0;
        for(int j=0;j<hollo[i].size();j++)
            if(dep<deep[hollo[i][j]])
                dep=deep[hollo[i][j]],u=hollo[i][j];
		for(int j=0;j<hollo[i].size();j++){
			int v=hollo[i][j];
			int t=lca(u,v);
			int dis=deep[u]+deep[v]-2*deep[t];
			maxn=dis>maxn?dis:maxn;
		}printf("%d\n",maxn);
	}
}