比赛 2017noip 评测结果 RRRRRRRRRRRRRRRRRRRR
题目名称 天天爱跑步 最终得分 0
用户昵称 pb0207 运行时间 2.475 s
代码语言 C++ 内存使用 53.34 MiB
提交时间 2017-09-21 10:35:35
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = 300011;
const int MAXM = 600011; 
int n,m,ecnt,first[MAXN],next[MAXM],to[MAXM],f[MAXN][20],deep[MAXN],ans[MAXN],val[MAXN],tong[MAXN],MAXD,w[MAXN],num[1000011];
vector<int>ljh[MAXN],ljh2[MAXN],ljh3[MAXN];
struct node{ int s,t,lca,len;}a[MAXN];
inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
    if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
}
inline void link(int x,int y){ next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y; }
inline void init(int x,int fa){ for(int i=first[x];i;i=next[i]) { int v=to[i]; if(v==fa) continue; deep[v]=deep[x]+1; init(v,x); f[v][0]=x; } }
inline int lca(int x,int y){
    if(deep[x]<deep[y]) swap(x,y); int t=0; while((1<<t)<=deep[x]) t++; t--;
    for(int i=t;i>=0;i--) if(deep[x]-(1<<i)>=deep[y]) x=f[x][i]; if(x==y) return y;
    for(int i=t;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; return f[x][0];
}

inline void dfs(int x,int fa){
    int now=w[x]+deep[x],cun; if(now<=MAXD) cun=tong[now];
    for(int i=first[x];i;i=next[i]) {
        int v=to[i]; if(v==fa) continue;
        dfs(v,x);
    }
    tong[deep[x]]+=val[x]; if(now<=MAXD) ans[x]=tong[now]-cun;
    for(int i=0,ss=ljh[x].size();i<ss;i++) tong[deep[ljh[x][i]]]--;
}

inline void DFS(int x,int fa){
    int now=deep[x]-w[x],cun; now+=300000; cun=num[now];
    for(int i=first[x];i;i=next[i]) {
        int v=to[i]; if(v==fa) continue;
        DFS(v,x);
    }
    for(int i=0,ss=ljh2[x].size();i<ss;i++) num[300000+ljh2[x][i]]++;
    ans[x]+=num[now]-cun;
    for(int i=0,ss=ljh3[x].size();i<ss;i++) num[300000+ljh3[x][i]]--;
}

inline void work(){  
    n=getint(); m=getint(); int x,y; for(int i=1;i<n;i++) { x=getint(); y=getint(); link(x,y); link(y,x); }
    for(int i=1;i<=n;i++) w[i]=getint(); deep[1]=1; init(1,0); for(int i=1;i<=n;i++) MAXD=max(MAXD,deep[i]);
    for(int j=1;j<=19;j++) for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; 
    for(int i=1;i<=m;i++) {
        a[i].s=getint(),a[i].t=getint(),val[a[i].s]++;
        a[i].lca=lca(a[i].s,a[i].t),a[i].len=deep[a[i].s]+deep[a[i].t]-deep[a[i].lca]*2;
        ljh[a[i].lca].push_back(a[i].s);
    }
    dfs(1,0); 
    for(int i=1;i<=m;i++) {
        ljh2[a[i].t].push_back(deep[a[i].t]-a[i].len);
        ljh3[a[i].lca].push_back(deep[a[i].t]-a[i].len);
    }
    DFS(1,0);
    for(int i=1;i<=m;i++) if(deep[a[i].s]-deep[a[i].lca]==w[a[i].lca]) ans[a[i].lca]--;
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);    
}

int main()
{
	freopen("runninga.in","r",stdin);
	freopen("runninga.out","w",stdout);
    work();
    return 0;
}