比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAAAAA
题目名称 政党 最终得分 100
用户昵称 NewBee 运行时间 0.701 s
代码语言 C++ 内存使用 16.33 MiB
提交时间 2016-10-07 16:43:12
显示代码纯文本
#include<cstdio>
#include<vector>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("cowpol.in","r",stdin);freopen("cowpol.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=300010;
vector<int> ve[maxn];
struct QUEUE{
	int head,tail,q[maxn];
	int F(int x){
		return ((x%maxn)+maxn)%maxn;
	}
	void push(int x){
		q[F(++tail)]=x;
	}
	int pop(){
		head++;
		return q[F(head-1)];
	}
	bool empty(){
		return head>tail;
	}
}q;
struct op{
	int to,next;
}r[maxn<<1];
int head[maxn],tim,deep[maxn],son[maxn],top[maxn],size[maxn],fath[maxn],n,k;
void dfs1(int rt){
	size[rt]=1;
	int y;
	for(int i=head[rt];i;i=r[i].next){
		y=r[i].to;
		if(size[y])continue;
		fath[y]=rt;
		deep[y]=deep[rt]+1;
		dfs1(y);
		if(size[y]>size[son[rt]])son[rt]=y;
		size[rt]+=size[y];
	}
}
void dfs2(int rt,int tp){
	top[rt]=tp;
	int y;
	if(son[rt])dfs2(son[rt],tp);
	for(int i=head[rt];i;i=r[i].next){
		y=r[i].to;
		if(top[y])continue;
		dfs2(y,y);
	}
}
void insert(int fr,int to){
	tim++;
	r[tim].to=to;
	r[tim].next=head[fr];
	head[fr]=tim;
}
void swap(int& x,int& y){
	int timee=x;
	x=y;y=timee;
}
int lca(int u,int v){
	while(top[u]!=top[v]){
		if(deep[top[u]]<deep[top[v]])swap(u,v);
		u=fath[top[u]];
	}
	if(deep[u]>deep[v])swap(u,v);
	return u;
}		
void getdis(int par){
	int u,v,t,disu=0,disx;
	int sizz=ve[par].size();
	v=ve[par][0];
	for(int i=1;i<sizz;i++){
		t=lca(v,ve[par][i]);
		disx=deep[v]+deep[ve[par][i]]-2*deep[t];
		if(disx>disu){
			u=ve[par][i];
			disu=disx;
		}
	}
	swap(u,v);
	disu=0;
	for(int i=0;i<sizz;i++){
		t=lca(v,ve[par][i]);
		disx=deep[v]+deep[ve[par][i]]-2*deep[t];
		if(disx>disu){
			u=ve[par][i];
			disu=disx;
		}
	}
	printf("%d\n",disu);
}	
void chul(){
	scanf("%d%d",&n,&k);
	int p,a;
	int rt;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a,&p);
		ve[a].push_back(i);
		if(p==0){
			rt=i;
		}
		else{
			insert(p,i);
		}
	}
	deep[rt]=1;
	dfs1(rt);
	fath[rt]=rt;
	dfs2(rt,rt);
	for(int i=1;i<=k;i++)getdis(i);
}
int main(){
	Begin;
}