这一份代码获得了三个不同的评测结果。。。
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int n,m,a[N],fa[N],fup[N],fdo[N],mn[N],mx[N],ans[N],vis[N];
struct node{int s,t,x;};
vector<node> qry[N],q[N];
vector<int> G[N];
int find(int x){
if (fa[x]==x)
return x;
int t=fa[x];
fa[x]=find(fa[x]);
fup[x]=max(mx[t]-mn[x],max(fup[x],fup[t]));
fdo[x]=max(mx[x]-mn[t],max(fdo[x],fdo[t]));
mn[x]=min(mn[x],mn[t]);
mx[x]=max(mx[x],mx[t]);
}
void dfs(int u,int pr){
vis[u]=1;
mn[u]=mx[u]=a[u];
fdo[u]=fup[u]=0;
for (node e:qry[u]){
int v=(e.s==u?e.t:e.s);
if (vis[v])
q[find(v)].push_back(e);
}
for (int v:G[u]) if (v!=pr)
dfs(v,u);
for (node res:q[u]){
find(res.s);
find(res.t);
ans[res.x]=max({mx[res.t]-mn[res.s],fup[res.s],fdo[res.t]});
}
fa[u]=pr;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for (int i=1;i<=n;i++)
fa[i]=i;
for (int i=1;i<=n;i++)
cin>>a[i];
for (int i=1;i<n;i++){
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
cin>>m;
for (int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
qry[x].push_back({x,y,i});
qry[y].push_back({x,y,i});
}
dfs(1,0);
for (int i=1;i<=m;i++)
cout<<ans[i]<<'\n';
return 0;
}
这是洛谷IDE:
这是学校OJ
这是我的本地

为了避免评测机不稳定导致的异常因素,我进行了多次测试,得到了相同的结果。。。
求调/求解