比赛 |
树形数据结构进阶(再进阶) |
评测结果 |
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;
}