比赛 csp2025模拟练习2 评测结果 AAAAATTTTTTTTTTTTTTT
题目名称 天天爱跑步 最终得分 25
用户昵称 会挽弯弓满月 运行时间 45.040 s
代码语言 C++ 内存使用 14.81 MiB
提交时间 2025-10-29 11:19:21
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=3e5+10;
ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<48||c>57){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c>=48&&c<=57){
		x=(x<<1)+(x<<3)+c-48;
		c=getchar();
	}
	return f*x;
}
ll n,m;
struct node{
	ll to,nxt;
}e[N<<1];
ll h[N],tot;
void add(ll u,ll v){
	e[++tot]={v,h[u]};
	h[u]=tot;
	return;
}
ll w[N];
struct load{
	ll s,t;
}q[N];
bool flag;
deque<ll> lu;
void dfs(ll u,ll fa,ll T,ll cnt){
	if(u==T){
		flag=1;
		return;
	}
	ll v;
	for(ll i=h[u];i;i=e[i].nxt){
		v=e[i].to;
		if(v==fa) continue;
		lu.push_back(v);
		dfs(v,u,T,cnt+1);
		if(flag) break;
		lu.pop_back();
	}
	return;
}
ll ans[N];
void solve(){
	ll num,u;
	for(ll i=1;i<=m;i++){
		flag=0;num=0;
		while(lu.size()) lu.pop_back();
		dfs(q[i].s,-1,q[i].t,1);
		while(lu.size()){
			num++;u=lu.front();
			if(w[u]==num) ans[u]++;
			lu.pop_front();
		}
		u=q[i].s;
		if(w[u]==0) ans[u]++;
	}
}
int main(){
	freopen("runninga.in","r",stdin);
	freopen("runninga.out","w",stdout);
	n=read();m=read();
	ll u,v;
	for(int i=1;i<n;i++){
		u=read();v=read();
		add(u,v);add(v,u);
	}
	
	for(int i=1;i<=n;i++) w[i]=read();
	for(int i=1;i<=m;i++){
		q[i].s=read();
		q[i].t=read();
	}
	solve();
	for(int i=1;i<=n;i++){
		printf("%lld ",ans[i]);
	}
	return 0;
}