比赛 树形数据结构进阶(再进阶) 评测结果 WWWWEWEEEEEEEWWWEWEW
题目名称 雨天的尾巴 最终得分 0
用户昵称 秋_Water 运行时间 2.941 s
代码语言 C++ 内存使用 14.29 MiB
提交时间 2025-04-19 11:27:58
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=2e3+5;
vector<int>G[N];
int f[N][30],dep[N],n,m,c[M][M],ans,ys[N];
map<int,int>mp;
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;(1<<i)<=dep[u];i++){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for(auto v:G[u]){
		if(v!=fa){
			dfs1(v,u);
		}
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v]){
		swap(u,v);
	}
	for(int i=log2(dep[u]);i>=0;i--){
		if((1<<i)<=dep[u]-dep[v]){
			u=f[u][i];
		}
	}
	if(u==v){
		return u;
	}
	for(int i=log2(dep[u]);i>=0;i--){
		if(f[u][i]!=f[v][i]){
			u=f[u][i],v=f[v][i];
		}
	}
	return f[u][0];
}
void dfs2(int u,int z,int fa){
	for(auto v:G[u]){
		if(v!=fa){
			dfs2(v,z,u);
			c[u][z]+=c[v][z];
		}
	}
}
int main(){
    freopen("Rainbows.in","r",stdin);
    freopen("Rainbows.out","w",stdout);    
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    int u,v;
    for(int i=1;i<n;i++){
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dfs1(1,0);
    int x,y,z,lcaa,lcafa;
    for(int i=1;i<=m;i++){
        cin>>x>>y>>z;
        ys[i]=z;
        lcaa=lca(x,y);
        lcafa=f[lcaa][0];
        c[x][z]++,c[y][z]++,c[lcaa][z]--,c[lcafa][z]--;
    }
    for(int i=1;i<=n;i++){
        dfs2(1,ys[i],0);
    }
    for(int i=1;i<=n;i++){
        int maxx=0;
        ans=0;
        for(int j=1;j<=n;j++){
            if(c[i][j]>maxx){
                maxx=c[i][j];
                ans=j;
            }
        }
        cout<<ans<<"\n";
    }

    return 0;
}