codeforces 442D Adam and Tree - ShinriiTin's Blog - 博主是sb
Link
Swap

codeforces 442D Adam and Tree

ShinriiTin posted @ 2015年6月15日 20:13 in 未分类 with tags DP 某不科学的三千元系列 , 1082 阅读

题意:

给出一棵树,最开始只有1个节点。

每个时刻,这棵树会长出一个叶子。

树上每条边都有且只有1种颜色,并且同一种颜色的边都连通。

定义一个点到根的距离为该点到根的路径上的颜色种数。

求每个时刻树上最大距离的最小值。

 

分析:

考虑每次向上更新dp值,直到更新到根或者不能更新为止。

由树链剖分可知这样做的复杂度是O(nlogn)的。

 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int MAXN=1e6+5;

int n;

int dp[MAXN],p[MAXN];

int mx1[MAXN],mx2[MAXN];

int main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout); 
	scanf("%d",&n);
	puts("0");
	for(int i=2;i<=n;++i){
		scanf("%d",p+i);
		dp[i]=1;
		int cur=i;
		while(cur!=1){
			int par=p[cur];
			if(dp[cur]>mx1[par]){
				mx2[par]=mx1[par];
				mx1[par]=dp[cur];
			}
			else if(dp[cur]>mx2[par]){
				mx2[par]=dp[cur];
			}
			cur=par;
			int res=max(mx1[cur],mx2[cur]+1);
			if(res==dp[cur])break;
			dp[cur]=res;
		}
		printf("%d\n",mx1[1]);
	}
	return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter