functionendless @ 2017-05-29 17:16:39
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define N 300010
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
int n,m,dep[N],w[N],fa[N],fat[N],s[N],t[N],anc[N],cnt[3*N],ans[N];
vector<int> map[N];
vector<pii> rela[N],cf[N];
bool used[N];
int find(int x) {if(x!=fat[x]) fat[x]=find(fat[x]); return fat[x];}
void build_tre(int root,int f)
{
int l=map[root].size();
for(int i=0;i<l;i++)
if(map[root][i]!=f)
{
int to=map[root][i];
dep[to]=dep[root]+1; fa[to]=root;
build_tre(to,root);
}
}
void tarjan(int u)
{
used[u]=1; fat[u]=u;
int l=rela[u].size();
for(int i=0;i<l;i++)
if(used[rela[u][i].F] && !anc[rela[u][i].S])
anc[rela[u][i].S]=find(rela[u][i].F);
l=map[u].size();
for(int i=0;i<l;i++)
if(map[u][i]!=fa[u])
{tarjan(map[u][i]); fat[map[u][i]]=u;}
}
void init()
{
for(int i=1;i<=m;i++)
{
if(anc[i]==s[i]) {cf[t[i]].pb(mp(dep[s[i]],1));cf[fa[s[i]]].pb(mp(dep[s[i]],-1));}
else if(anc[i]==t[i]) {cf[s[i]].pb(mp(dep[s[i]],1));cf[fa[t[i]]].pb(mp(dep[s[i]],-1));}
else
{
cf[s[i]].pb(mp(dep[s[i]],1));
cf[fa[anc[i]]].pb(mp(dep[s[i]],-1));
cf[t[i]].pb(mp(dep[anc[i]]*2-dep[s[i]],1));
cf[anc[i]].pb(mp(dep[anc[i]]*2-dep[s[i]],-1));
}
}
}
void dfs(int u)
{
int sum=cnt[dep[u]+w[u]+N]+cnt[dep[u]-w[u]+N],l=cf[u].size();
for(int i=0;i<l;i++) cnt[cf[u][i].F+N]+=cf[u][i].S;
l=map[u].size();
for(int i=0;i<l;i++) if(map[u][i]!=fa[u]) dfs(map[u][i]);
ans[u]=cnt[dep[u]+w[u]+N]+cnt[dep[u]-w[u]+N]-sum;
if (!w[u]) ans[u]>>=1;
}
int main()
{
int i,x,y;
scanf("%d %d",&n,&m);
for(i=1;i<n;i++) {scanf("%d %d",&x,&y); map[x].pb(y); map[y].pb(x);}
for(i=1;i<=n;i++) scanf("%d",&w[i]);
build_tre(1,0);
for(i=1;i<=m;i++) {scanf("%d %d",&s[i],&t[i]); rela[s[i]].pb(mp(t[i],i)); rela[t[i]].pb(mp(s[i],i));}
tarjan(1);
init(); dfs(1);
for(i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}
T了第十三个点,但貌似不是真正的TLE,个人估计是哪里死循环了