这是我后来的满分代码
#include <iostream>
#include <vector>
using namespace std;
int n,m;
int cnt;
int u,v,z;
vector<int>son[100010];
int tp[100010],sz[100010],h[100010],dp[100010],f[100010],rt[100010],rs[100010];
struct node{
int lson,rson,mx,res;
}t[6000010];
void pushup(int id)
{
if(t[t[id].rson].mx>t[t[id].lson].mx) t[id].mx=t[t[id].rson].mx,t[id].res=t[t[id].rson].res;
else t[id].res=t[t[id].lson].res,t[id].mx=t[t[id].lson].mx;
}
void add(int id,int l,int r,int x,int y)
{
if(l==r) return t[id].mx+=y,t[id].res=x,void();
int mid=l+r>>1;
if(x<=mid)
{
if(!t[id].lson) t[id].lson=++cnt;
add(t[id].lson,l,mid,x,y);
}
else
{
if(!t[id].rson) t[id].rson=++cnt;
add(t[id].rson,mid+1,r,x,y);
}
pushup(id);
}
int merge(int x,int y)
{
if(!x || !y) return x|y;
if(!max(t[x].lson,t[x].rson) && !max(t[y].lson,t[y].rson))
{
if(t[x].res==t[y].res) t[x].mx+=t[y].mx;
else if(t[y].mx>t[x].mx) t[x].res=t[y].res,t[x].mx=t[y].mx;
return x;
}
t[x].lson=merge(t[x].lson,t[y].lson);
t[x].rson=merge(t[x].rson,t[y].rson);
pushup(x);
return x;
}
void dfs1(int now,int fa,int dpt)
{
dp[now]=dpt;
sz[now]=1;
f[now]=fa;
for(int s:son[now]) if(s!=fa)
{
dfs1(s,now,dpt+1);
sz[now]+=sz[s];
if(sz[s]>=sz[h[now]]) h[now]=s;
}
}
void dfs2(int now,int fa,int top)
{
tp[now]=top;
if(h[now])
{
dfs2(h[now],now,top);
for(int s:son[now])
if(s!=fa && s!=h[now])
dfs2(s,now,s);
}
}
int lca(int a,int b)
{
while(tp[a]!=tp[b])
{
if(dp[tp[a]]>dp[tp[b]]) a=f[tp[a]];
else b=f[tp[b]];
}
return (dp[a]>dp[b]?b:a);
}
void dfs3(int now,int fa)
{
for(int s:son[now]) if(s!=fa)
{
dfs3(s,now);
rt[now]=merge(rt[now],rt[s]);
}
if(t[rt[now]].mx==0) rs[now]=0;
else rs[now]=t[rt[now]].res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;++i)
{
cin>>u>>v;
son[u].push_back(v);
son[v].push_back(u);
}
dfs1(1,0,0);
dfs2(1,0,1);
for(int i=1;i<=n;++i) rt[i]=i;
cnt=n;
for(int i=1;i<=m;++i)
{
cin>>u>>v>>z;
int uu=lca(u,v),vv=f[uu];
add(rt[u],1,100000,z,1);
add(rt[v],1,100000,z,1);
add(rt[uu],1,100000,z,-1);
if(vv) add(rt[vv],1,100000,z,-1);
}
dfs3(1,0);
for(int i=1;i<=n;++i) cout<<rs[i]<<endl;
return 0;
}
原来dfs3是这样写的,我觉得全局变量的初值应该是0啊,为什么还需要特判?
void dfs3(int now,int fa)
{
for(int s:son[now]) if(s!=fa)
{
dfs3(s,now);
rt[now]=merge(rt[now],rt[s]);
}
rs[now]=t[rt[now]].res;/////////看这里
}