| 比赛 |
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;
}