0分求助
  • 板块P3252 [JLOI2012] 树
  • 楼主Ch35
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/10 16:02
  • 上次更新2023/10/27 16:06:23
查看原帖
0分求助
672360
Ch35楼主2022/8/10 16:02

0分

#include<bits/stdc++.h>
using namespace std;
const int nn=200000;
int head[nn+10],nxt[nn*2+10],c[nn*2+10],cnt,cost[nn+10],ans;
int n,s;
int dp[nn+10][20];
int sum[nn+10][20];
void add(int u,int v){
	c[cnt]=v,nxt[cnt]=head[u],head[u]=cnt++;
}
void dfs(int now,int fa){
	//printf("%d %d\n",now,fa);
	dp[now][0]=fa;
	sum[now][0]=cost[now];
	for(int i=1;i<=19;i++){
		if(dp[now][i-1]==0){
			dp[now][i]=0;
			sum[now][i]=sum[now][i-1];
		}
		else{
			dp[now][i]=dp[ dp[now][i-1] ][i-1];
			sum[now][i]=sum[now][i-1]+sum[ dp[now][i-1] ][i-1];
		}
	}
	int k=s;
	int q=now;
	for(int i=19;i>=0;i--){
		if(sum[q][i]==k){
			ans++;
			break;
		}else{
			if(sum[q][i]<k){
				k=k-sum[q][i];
				q=dp[q][i];
			}
		}
	}
	
	for(int i=head[now];i!=1;i=nxt[i]){
		int nt=c[i];
		if(nt==fa) continue;
		dfs(nt,now);
	}
}
int main(){
	scanf("%d%d",&n,&s);
	memset(head,-1,sizeof(head));
	for(int i=1;i<=n;i++){
		int a;
		scanf("%d",&a);
		cost[i]=a;
	}
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}
2022/8/10 16:02
加载中...