hhdddkk @ 2019-10-29 20:56:11
#include<bits/stdc++.h>
using namespace std;
int n,m,d[300005],fa[300005][25],lca[300005];
int cnt,ver[300005],nt[300005],hd[300005];
int w[300005],s[300005],t[300005];
int c[600010],ans[300005];
vector<int> a[300005];
int Read(){
int num=0;
char cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9'){
num=(num<<1)+(num<<3);
num+=cc-'0';
cc=getchar();
}
return num;
}
void Add(int u,int v){
ver[++cnt]=v;
nt[cnt]=hd[u];
hd[u]=cnt;
}
void dfs1(int p,int f){
d[p]=d[f]+1;
fa[p][0]=f;
for(int i=1;i<20;i++) fa[p][i]=fa[fa[p][i-1]][i-1];
for(int i=hd[p];i;i=nt[i]){
if(ver[i]==f) continue;
dfs1(ver[i],p);
}
}
int Find(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=19;i>=0;i--)
if(d[fa[x][i]]>=d[y]) x=fa[x][i];
if(x==y) return x;
for(int i=19;i>=0;i--)
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
return fa[x][0];
}
void dfs2(int p){
int num=c[w[p]+d[p]];
for(int i=0;i<a[p].size();i++){
int x=a[p][i];
if(x>0) c[x]++;
if(x<0) c[-x]--;
}
for(int i=hd[p];i;i=nt[i]){
if(ver[i]==fa[p][0]) continue;
dfs2(ver[i]);
}
ans[p]=c[w[p]+d[p]]-num;
}
void dfs3(int p){
int num=c[(n+1)+w[p]-d[p]];
for(int i=0;i<a[p].size();i++){
int x=a[p][i];
if(x>0) c[x]++;
if(x<0) c[-x]--;
}
for(int i=hd[p];i;i=nt[i]){
if(ver[i]==fa[p][0]) continue;
dfs3(ver[i]);
}
ans[p]=c[(n+1)+w[p]-d[p]]-num+ans[p];
}
int main(){
n=Read();m=Read();
for(int i=1;i<n;i++){
int u,v;
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++){
s[i]=Read();t[i]=Read();
}
dfs1(1,0);
for(int i=1;i<=m;i++) lca[i]=Find(s[i],t[i]);
for(int i=1;i<=m;i++){
a[s[i]].push_back(d[s[i]]);
a[fa[lca[i]][0]].push_back(-d[s[i]]);
}
dfs2(1);
memset(c,0,sizeof(c));
for(int i=0;i<=n;i++) a[i].clear();
for(int i=1;i<=m;i++){
int len=d[s[i]]-2*d[lca[i]]+(n+1);
a[t[i]].push_back(len);
a[lca[i]].push_back(-len);
}
dfs3(1);
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}
by hhdddkk @ 2019-10-29 20:59:16
是指出题人给的最后一个点(299998)的数据,测试里是第13个点
by TLE自动机 @ 2019-11-07 13:48:45
@hhdddkk wdm数组真就卡着开啊
by hhdddkk @ 2019-11-08 20:39:03
@TLE自动机 啊,确实,是存边的数组开小了,居然犯了这种低级错误,不过这为什么是WA而不是RE呢
by TLE自动机 @ 2019-11-09 08:37:48
@hhdddkk 越界越一点好像会导致访问到其他申请过的内存吧