这题我调了两天了,找不到任何问题……
哪名大佬能帮帮我吗?
#include<iostream>
#include<vector>
using namespace std;
const int N=4e5;
int tree[15*N];
int maxp[15*N];
int ls[15*N];
int rs[15*N];
int cnt=0;
void pushup(int root){
if(tree[ls[root]]>=tree[rs[root]])
maxp[root]=maxp[ls[root]],tree[root]=tree[ls[root]];
else maxp[root]=maxp[rs[root]],tree[root]=tree[rs[root]];
}
#define mid ((l+r)>>1)
void insert(int& root,int l,int r,int pos,int data){
if(root==0)
root=++cnt;
if(l==r){
tree[root]+=data;
maxp[root]=l;
return ;
}
if(pos<=mid)
insert(ls[root],l,mid,pos,data);
else insert(rs[root],mid+1,r,pos,data);
pushup(root);
}
int merge(int x,int y,int l,int r){
if(x==0||y==0)
return x+y;
if(l==r){
tree[x]+=tree[y];
maxp[x]=l;
return x;
}
ls[x]=merge(ls[x],ls[y],l,mid);
rs[x]=merge(rs[x],rs[y],mid+1,r);
pushup(x);
return x;
}
struct side{
int t,n;
}ss[N];
int head[N];
int pcnt=0;
void add(int f,int t){
ss[++pcnt].t=t;
ss[pcnt].n=head[f];
head[f]=pcnt;
}
#define FOR(x) for(int nxt=head[x];nxt;nxt=ss[nxt].n)
#define TP ss[nxt].t
vector<pair<int,int> > adp[N];
int n,m;
int fa[N][100];
int dep[N];
void dfs(int x,int fat){
fa[x][0]=fat;
dep[x]=dep[fat]+1;
FOR(x){
if(TP==fat)
continue;
dfs(TP,x);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])
swap(x,y);
for(int i=30;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
if(x==y)
return x;
for(int i=30;i>=0;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
void print(int root,int l,int r){
if(l==r){
if(tree[root]!=0)
cout<<l<<":"<<tree[root]<<" ";
return ;
}
print(ls[root],l,mid);
print(rs[root],mid+1,r);
}
int ans[N];
int root[N];
const int Z=1e7;
void search(int x,int fa){
FOR(x){
if(TP==fa)
continue;
search(TP,x);
root[x]=merge(root[x],root[TP],1,Z);
}
for(int i=0;i<adp[x].size();i++)
insert(root[x],0,Z,adp[x][i].first,adp[x][i].second);
// cout<<"at p="<<x<<" ";
// print(root[x],1,Z);
// cout<<endl;
ans[x]=maxp[root[x]];
}
int main(){
cin>>n>>m;
for(int f,t,i=1;i<n;i++){
cin>>f>>t;
add(f,t);
add(t,f);
}
dep[1]=1;
dfs(1,0);
fa[1][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=30;j++)
fa[i][j]=fa[fa[i][j-1]][j-1];
for(int a,b,z,i=1;i<=m;i++){
cin>>a>>b>>z;
int lcap=lca(a,b);
adp[a].push_back(make_pair(z,1));
adp[b].push_back(make_pair(z,1));
// cout<<lcap<<endl;
adp[lcap].push_back(make_pair(z,-1));
adp[fa[lcap][0]].push_back(make_pair(z,-1));
}
search(1,0);
for(int i=1;i<=n;i++)
cout<<ans[i]<<endl;
// system("pause");
}