rt,如果没写错的话,理论时间复杂度应该是 O(nlog2n) 的,但是代码没跑过 105。
#include<iostream>
#define mid ((l+r)/2)
using namespace std;
int n,q;
int a[200005];
struct EDGE{
int u,v,w,nxt;
}edge[200005];
int head[100005],tot;
void add(int u,int v,int w){
edge[++tot]={u,v,w,head[u]};
head[u]=tot;
}
int dep[100005],fa[100005],hson[100005],siz[100005];
void dfs1(int x,int f){
fa[x]=f;
dep[x]=dep[f]+1;
siz[x]=1;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].v;
if(v==f)continue;
a[v]=edge[i].w;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[v]>siz[hson[x]])hson[x]=v;
}
}
int top[100005],dfn[100005],idx,rnk[100005];
void dfs2(int x){
dfn[x]=++idx;
rnk[idx]=x;
if(hson[x]){
top[hson[x]]=top[x];
dfs2(hson[x]);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].v;
if(v==fa[x]||v==hson[x])continue;
top[v]=v;
dfs2(v);
}
}
struct node{
int maxn,minn;
}tr[400005];
void pushup(int x){
tr[x].maxn=max(tr[2*x].maxn,tr[2*x+1].maxn);
tr[x].minn=min(tr[2*x].minn,tr[2*x+1].minn);
}
void build(int x,int l,int r){
if(l==r){
tr[x].maxn=tr[x].minn=a[rnk[l]];
return ;
}
build(2*x,l,mid);
build(2*x+1,mid+1,r);
pushup(x);
}
int query(int x,int l,int r,int from,int to,int f){
if(from<=l&&r<=to){
if(f==1)return tr[x].maxn;
return tr[x].minn;
}
int ans;
if(f==1)ans=-1e18;
else ans=1e18;
if(from<=mid){
if(f==1)ans=max(ans,query(2*x,l,mid,from,to,f));
if(f==2)ans=min(ans,query(2*x,l,mid,from,to,f));
}
if(to>mid){
if(f==1)ans=max(ans,query(2*x+1,mid+1,r,from,to,f));
if(f==2)ans=min(ans,query(2*x+1,mid+1,r,from,to,f));
}
return ans;
}
void Query(int u,int v){
int ans1=-1e18,ans2=1e18;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
ans1=max(ans1,query(1,1,n,dfn[top[u]],dfn[u],1));
ans2=min(ans2,query(1,1,n,dfn[top[u]],dfn[u],2));
u=fa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
if(u!=v){
ans1=max(ans1,query(1,1,n,dfn[v]+1,dfn[u],1));
ans2=min(ans2,query(1,1,n,dfn[v]+1,dfn[u],2));
}
cout<<ans2<<' '<<ans1<<endl;
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dfs1(1,0);
top[1]=1;
dfs2(1);
build(1,1,n);
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
Query(u,v);
}
return 0;
}