第一份T了(55pts),第二份是昨晚写的(感觉写得一样啊qaq)。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,m,X[N],Y[N],Z[N],mx;
int head[N],to[N],ne[N],tot;
void add(int x,int y){
ne[++tot]=head[x];
to[tot]=y;
head[x]=tot;
}
int son[N],top[N],si[N],fa[N],de[N];
void dfs1(int u,int f){
fa[u]=f,de[u]=de[f]+1,si[u]=1;
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==f) continue;
dfs1(v,u);
si[u]+=si[v];
if(si[v]>si[son[u]]) son[u]=v;
}
}
void dfs2(int u,int topp){
top[u]=topp;
if(son[u]) dfs2(son[u],topp);
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==son[u] or v==fa[u]) continue;
dfs2(v,v);
}
}
int get_lca(int x,int y){
while(top[x]!=top[y]){
if(de[top[x]]<de[top[y]]) swap(x,y);
x=fa[top[x]];
}
return de[x]<=de[y]?x:y;
}
struct tree{
int ls,rs;
int mx_pos,mx_num;
}t[N];int rt[N],cnt;
#define lson t[i].ls
#define rson t[i].rs
void push_up(int i){
if(t[lson].mx_num>=t[rson].mx_num) t[i].mx_num=t[lson].mx_num,t[i].mx_pos=t[lson].mx_pos;
else t[i].mx_num=t[rson].mx_num,t[i].mx_pos=t[rson].mx_pos;
if(!t[i].mx_num) t[i].mx_pos=0;
}
void change(int &i,int l,int r,int pos,int val){
if(!i) i=++cnt;
if(l==r){t[i].mx_num+=val,t[i].mx_pos=pos;return;}
int mid=(l+r)>>1;
if(pos<=mid) change(lson,l,mid,pos,val);
else change(rson,mid+1,r,pos,val);
push_up(i);
}
int merge(int x,int y,int l,int r){
if(!x) return y;if(!y) return x;
if(l==r){t[x].mx_num+=t[y].mx_num,t[x].mx_pos=l;return x;}
int mid=(l+r)>>1;
t[x].ls=merge(t[x].ls,t[y].ls,l,mid),t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);
push_up(x);
return x;
}
int ans[N];
void dfs(int u){
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa[u]) continue;
dfs(v);
rt[u]=merge(rt[u],rt[v],1,mx);
}
ans[u]=t[rt[u]].mx_pos;
}
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
add(x,y),add(y,x);
}
dfs1(1,0),dfs2(1,1);
for(int i=1;i<=m;i++) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),mx=max(mx,Z[i]);
for(int i=1;i<=m;i++){
int x=X[i],y=Y[i],z=Z[i];
int lca=get_lca(x,y);
change(rt[x],1,mx,z,1),change(rt[y],1,mx,z,1);
change(rt[lca],1,mx,z,-1);
if(fa[lca]) change(rt[fa[lca]],1,mx,z,-1);
}
dfs(1);
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}
AC的:
#include<bits/stdc++.h>
using namespace std;
const int N=6000005,M=100005;
int n,m,mxnum[N],rt[M],cnt,mx;
int head[M],to[N],ne[N],tot;
struct tree{int mxpos,ls,rs;}t[N];
void add(int x,int y){
ne[++tot]=head[x];
to[tot]=y;
head[x]=tot;
}
int si[M],son[M],de[M],fa[M],top[M];
void dfs1(int x) {
si[x]=1;int maxx=-1;
for(int i=head[x];i;i=ne[i])
if(!de[to[i]]){
de[to[i]]=de[x]+1,fa[to[i]]=x;
dfs1(to[i]);
si[x]+=si[to[i]];
if(si[to[i]]>maxx) maxx=si[to[i]],son[x]=to[i];
}
}
void dfs22(int x,int topf) {
top[x]=topf;
if(!son[x]) return;
dfs22(son[x],topf);
for(int i=head[x];i;i=ne[i]) if(!top[to[i]]) dfs22(to[i],to[i]);
}
int get_lca(int x,int y) {
while(top[x]!=top[y]){
if(de[top[x]]<de[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(de[x]<de[y]) return x;
else return y;
}
void pushup(int i){
if(mxnum[t[i].ls]>=mxnum[t[i].rs]) mxnum[i]=mxnum[t[i].ls],t[i].mxpos=t[t[i].ls].mxpos;
else mxnum[i]=mxnum[t[i].rs],t[i].mxpos=t[t[i].rs].mxpos;
if(!mxnum[i]) t[i].mxpos=0;
}
int change(int i,int l,int r,int pos,int val){
if(!i) i=++cnt;
if(l==r){mxnum[i]+=val,t[i].mxpos=pos;return i;}
int mid=(l+r)>>1;
if(pos<=mid) t[i].ls=change(t[i].ls,l,mid,pos,val);
else t[i].rs=change(t[i].rs,mid+1,r,pos,val);
pushup(i);
return i;
}
int merge(int x,int y,int l,int r){
if(!x) return y;
if(!y) return x;
if(l==r){mxnum[x]+=mxnum[y],t[x].mxpos=l;return x;}
int mid=(l+r)>>1;
t[x].ls=merge(t[x].ls,t[y].ls,l,mid),t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);
pushup(x);
return x;
}
int ans[N];
void dfs2(int u){
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa[u]) continue;
dfs2(v);
rt[u]=merge(rt[u],rt[v],1,mx);
}
ans[u]=t[rt[u]].mxpos;
}
int X[N],Y[N],Z[N];
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
de[1]=1,dfs1(1),dfs22(1,1);
for(int i=1;i<=m;i++) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),mx=max(mx,Z[i]);
for(int i=1;i<=m;i++){
int x=X[i],y=Y[i],z=Z[i];
int lca=get_lca(x,y);
rt[x]=change(rt[x],1,mx,z,1),rt[y]=change(rt[y],1,mx,z,1);
rt[lca]=change(rt[lca],1,mx,z,-1);
if(fa[lca]) rt[fa[lca]]=change(rt[fa[lca]],1,mx,z,-1);
}
dfs2(1);
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}