比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAAAAA
题目名称 政党 最终得分 100
用户昵称 _Itachi 运行时间 0.629 s
代码语言 C++ 内存使用 17.78 MiB
提交时间 2016-10-07 16:35:27
显示代码纯文本
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<algorithm>
namespace _tool{
#define INF 0x7f7f7f7f
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
#define _upsize f[rt]=f[rt<<1]+f[rt<<1|1];
#define maxn 500010
#define fre freopen("cowpol.in","r",stdin);freopen("cowpol.out","w",stdout);
#define _max(a,b) ((a)>(b)?(a):(b))
#define _min(a,b) ((a)<(b)?(a):(b))
int _log2(const int &x){int k=0;while(1<<(k+1)<=x)k++;return k;}
int _read(){int ret,neg;char ch;ret=neg=0;while(!isdigit(ch=getchar())&&ch!='-');if(ch=='-')neg=1,ch=getchar();while(ret=ret*10+ch-'0',isdigit(ch=getchar()));if(neg)ret=-ret;return ret;}
}
using namespace _tool;
using namespace std;
struct _tree{
	int to,next;
}e[maxn<<1],gcd[maxn<<1];
int n,m,len=0,cnt=0,ans;
int head[maxn],fa[maxn],Dp[maxn],size[maxn],son[maxn],top[maxn],prev[maxn];
void _set(int prt,int son){
	e[++len].to=son,e[len].next=head[prt],head[prt]=len;
}
void _set1(int prt,int son){
	gcd[++cnt].to=son,gcd[cnt].next=prev[prt],prev[prt]=cnt;
}
#define to e[i].to
void _dfs(int rt){
	size[rt]=1;
	for(int i=head[rt];i;i=e[i].next)
	if(!size[to]){
		fa[to]=rt,Dp[to]=Dp[rt]+1;
		_dfs(to);
		size[rt]+=size[to];
		if(size[son[rt]]<size[to])son[rt]=to;
	}
}
void _dfs(int rt,int tp){
	top[rt]=tp;
	if(son[rt])_dfs(son[rt],tp);
	for(int i=head[rt];i;i=e[i].next)
	if(!top[to])_dfs(to,to);
}
#undef to
int _query(int x,int y){
	int t; 
	while(top[x]^top[y]){
		if(Dp[top[x]]<Dp[top[y]])t=x,x=y,y=t;
		x=fa[top[x]];
	}
	if(Dp[x]>Dp[y])t=x,x=y,y=t;
	return x;
}
bool _Rabit(),_RABIT=_Rabit();int main(){;}
bool _Rabit(){
	fre
	n=_read(),m=_read();
	for(int a,p,i=1;i<=n;i++){
		a=_read(),p=_read();
		_set1(a,i);
		_set(p,i),_set(i,p);
	}
	Dp[1]=1,fa[1]=1;_dfs(1);_dfs(1,1);
	for(int a,sonn,v=1;v<=m;v++){
		ans=-INF;sonn=a=gcd[prev[v]].to;
		for(int k,b,i=gcd[prev[v]].next;i;i=gcd[i].next){
			b=gcd[i].to;k=_query(a,b);
			if(ans<Dp[a]+Dp[b]-Dp[k]-Dp[k])
				ans=Dp[a]+Dp[b]-Dp[k]-Dp[k],sonn=b;
		}
		for(int i=prev[v];i;i=gcd[i].next)
			if(gcd[i].to^sonn)
				ans=_max(ans,Dp[sonn]+Dp[gcd[i].to]-(Dp[_query(sonn,gcd[i].to)]<<1));
		printf("%d\n",ans);
	}
}