对 C 不是很熟悉,哪路神仙帮我转好了,在这个帖子里发给我,万分感谢!!
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int tree[maxn<<2],id,n;
int dfn[maxn],siz[maxn],dep[maxn];
int fath[maxn],son[maxn],head[maxn];
int du[maxn],dv[maxn],dw[maxn];
vector<int>edge[maxn];
inline void pushup(int p){
tree[p]=max(tree[p<<1],tree[p<<1|1]);
}
inline void build(int p,int pl,int pr){
tree[p]=0; if(pl==pr) return;
int mid=(pl+pr)>>1;
build(p<<1,pl,mid); build(p<<1,mid+1,pr);
return;
}
inline void update(int d,int p,int pl,int pr,int k){
if(pl==pr){tree[p]=k;return;}
int mid=(pl+pr)>>1;
if(d<=mid) update(d,p<<1,pl,mid,k);
else update(d,p<<1|1,mid+1,pr,k);
return pushup(p);
}
inline int query(int l,int r,int p,int pl,int pr){
if(l<=pl and pr<=r) return tree[p];
int mid=(pl+pr)>>1,ans=0;
if(l<=mid) ans=max(ans,query(l,r,p<<1,pl,mid));
if(r>mid) ans=max(ans,query(l,r,p<<1|1,mid+1,pr));
return ans;
}
inline void dfs1(int u,int dad){
fath[u]=dad; siz[u]=1;
dep[u]=dep[dad]+1;
for(int v:edge[u]){
if(v==dad) continue;
dfs1(v,u); siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
return;
}
inline void dfs2(int u,int hd){
head[u]=hd; dfn[u]=++id;
if(son[u]) dfs2(son[u],hd);
for(int v:edge[u]){
if(v!=fath[u] and v!=son[u]) dfs2(v,v);
}
return;
}
inline int qry(int u,int v){
int ans=0;
while(head[u]!=head[v]){
if(dep[head[u]]<dep[head[v]]) swap(u,v);
ans=max(ans,query(dfn[head[u]],dfn[u],1,1,n));
u=fath[head[u]];
}
if(dep[u]<dep[v]) swap(u,v);
if(u!=v) ans=max(ans,query(dfn[v]+1,dfn[u],1,1,n));
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t; cin>>t;
while(t--){
cin>>n;
for(int i=1;i<n;i++){
cin>>du[i]>>dv[i]>>dw[i];
edge[du[i]].push_back(dv[i]);
edge[dv[i]].push_back(du[i]);
}
dfs1(1,0); dfs2(1,1);
build(1,1,n);
for(int i=1;i<n;i++){
if(dep[du[i]]>dep[dv[i]]) swap(du[i],dv[i]);
update(dfn[dv[i]],1,1,n,dw[i]);
}
string opt; int u,v;
while(cin>>opt and opt!="DONE"){
cin>>u>>v;
if(opt=="QUERY") cout<<qry(u,v)<<"\n";
else update(dfn[dv[u]],1,1,n,v);
}
}
return 0;
}