本机+不开 O2 IDE 测试点1(样例)都能过,但是评测记录一半T一半RE。目前已探查的情况是 dfs3() 前应该都对,dfs3()中无法遍历vector导致超时。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int dep[N],fa[N],siz[N],son[N],id[N],top[N];
vector<int>s[N];
void dfs1(int x,int f){
dep[x]=dep[f]+1;
fa[x]=f;
siz[x]=1;
int maxson=-1;
for(int i=0;i<s[x].size();i++){
int y=s[x][i];
if(y==f) continue;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>=maxson) {
maxson=siz[y];
son[x]=y;
}
}
}
int ct;
void dfs2(int x,int topf){
top[x]=topf;
id[x]=++ct;
if(son[x]) dfs2(son[x],topf);
for(int i=0;i<s[x].size();i++){
int y=s[x][i];
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
}
int tree[N*4],tid[N*4],cnt;
int ls[N],rs[N];
void push_up(int p){
tree[p]=max(tree[ls[p]],tree[rs[p]]);
tid[p]=9999999;
if(tree[ls[p]]==tree[p]) tid[p]=min(tid[p],tid[ls[p]]);
if(tree[rs[p]]==tree[p]) tid[p]=min(tid[p],tid[rs[p]]);
return ;
}
int k,n,m;
#define MID int mid=l+r>>1;
int update(int p,int l,int r,int x,int k){
if(!p) p=++cnt;
if(l==r) {
tree[p]+=k;
tid[p]=x;//
return p;
}
MID;
if(x<=mid) ls[p]=update(ls[p],l,mid,x,k);
else rs[p]=update(rs[p],mid+1,r,x,k);
push_up(p);
return p;
}
int LCA(int x,int y){
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
int merge(int p,int q,int l,int r){
//q=p+q
if(!p||!q) return p+q;
if(l==r){
tree[q]=tree[p]+tree[q];
tid[q]=l;
return q;
}
MID;
ls[q]=merge(ls[p],ls[q],l,mid);
rs[q]=merge(rs[p],rs[q],mid+1,r);
push_up(q);
return q;
}
int rt[N],ans[N];
int dfs3(int x){
for(int i=0;i<s[x].size();i++){
int y=s[x][i];
if(y==fa[x]) continue;
dfs3(y);
rt[x]=merge(rt[y],rt[x],1,k);
}
ans[x]=tid[rt[x]];
}
int read(){
int h=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) h=(h<<1)+(h<<3)+c-'0',c=getchar();
return h;
}
int main(){
n=read(),m=read();
for(int i=1;i<n;i++) {
int u=read(),v=read();
s[u].push_back(v);
s[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
k=int(1e5);
for(int i=1;i<=m;i++) {
int x=read(),y=read(),z=read(),lca=LCA(x,y);
rt[x]=update(rt[x],1,k,z,1);
rt[y]=update(rt[y],1,k,z,1);
rt[lca]=update(rt[lca],1,k,z,-1);
// cout<<lca<<endl;
if(fa[lca]) rt[fa[lca]]=update(rt[fa[lca]],1,k,z,-1);
}
dfs3(1);
for(int i=1;i<=n;i++) cout<<ans[i]<<"\n";
return 0;
}
cpp```