样例不过,玄关求调
查看原帖
样例不过,玄关求调
929151
xxr___楼主2025/1/26 19:07
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define pre(i,l,r) for(int i=(l);i>=(r);--i)
const int N=1e5+5;
const int M=N*50;
int res[M],sum[M],cnt=0,dep[N],fa[N][20],ans[N],rt[N];
int ls[M],rs[M],n,m;
vector<int> e[N];
void upd(int x){
    if(sum[ls[x]]<sum[rs[x]]){
        res[x]=res[rs[x]];
        sum[x]=sum[rs[x]];
    }else{
        res[x]=res[ls[x]];
        sum[x]=sum[ls[x]];
    }
}
int merge(int u,int v,int l,int r){
    if(!u) return v;
    if(!v) return u;
    if(u==v){
        sum[u]+=sum[v];
        return u;
    }
    int mid=(l+r)>>1;
    ls[u]=merge(ls[u],ls[v],l,mid);
    rs[u]=merge(rs[u],rs[v],mid+1,r);
    upd(u);
    return u;
} 
int add(int u,int l,int r,int col,int vl){
    if(!u) u=++cnt;
    if(l==r){
        sum[u]+=vl;
        res[u]=col;
        return u;
    }
    int mid=(l+r)>>1;
    if(col<=mid){
        ls[u]=add(ls[u],l,mid,col,vl);
    }else{
        rs[u]=add(rs[u],mid+1,r,col,vl);
    }
    upd(u);
    return u;
}
void dfs(int u,int f){
    fa[u][0]=f;dep[u]=dep[f]+1;
    for(auto it:e[u]){
        if(it!=f){
            dfs(it,u);
        }
    }
}
void init(){
    rep(j,1,19){
        rep(i,1,n){
            fa[i][j]=fa[fa[i][j-1]][j-1];
        }
    }
}
int lca(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    pre(i,19,0){
        if(dep[u]-(1<<i)>=dep[v]){
            u=fa[u][i];
        }
    }
    if(u==v) return u;
    pre(i,19,0){
        if(fa[u][i]!=fa[v][i]){
            u=fa[u][i];v=fa[v][i];
        }
    }
    return fa[u][0];
}
void calc(int u){
    for(auto it:e[u]){
        if(it!=fa[u][0]){
            calc(it);
            rt[u]=merge(rt[u],rt[it],1,100000); 
        }
    }
    ans[u]=res[rt[u]];
    cout<<rt[u]<<' '<<res[rt[u]]<<'\n';
    if(!sum[rt[u]]) ans[u]=0;
} 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n>>m;
    rep(i,1,n-1){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(1,0);init();
    rep(i,1,m){
        int x,y,z,k=0;
        cin>>x>>y>>z;
        k=lca(x,y);
        rt[x]=add(rt[x],1,100000,z,1);
        rt[y]=add(rt[y],1,100000,z,1);
        rt[k]=add(rt[k],1,100000,z,-1);
        rt[fa[k][0]]=add(rt[fa[k][0]],1,100000,z,-1);
    }
    calc(1);
    rep(i,1,n) cout<<ans[i]<<'\n';
    return 0;
}

2025/1/26 19:07
加载中...