比赛 |
CSP2023-S模拟赛 |
评测结果 |
EEEEEEAAAEEEEEEEEEEE |
题目名称 |
坡伊踹 |
最终得分 |
15 |
用户昵称 |
李栋阳 |
运行时间 |
8.781 s |
代码语言 |
C++ |
内存使用 |
49.68 MiB |
提交时间 |
2023-10-17 21:36:07 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[200005],dp[200005],e[200005];
int f[200005][21];
struct node{
int nxt,w;
};
int n,q;
vector<node> tr[200005];
int lca(int a,int b){
if(dp[a]>dp[b]) swap(a,b);
for(int i=20;i>=0;i--){
if(dp[a]<=dp[b]-(1<<i)){
b=f[b][i];
}
}
if(a==b){
return a;
}
for(int i=20;i>=0;i--){
if(f[a][i]==f[b][i]){
continue;
}
else {
a=f[a][i],b=f[b][i];
}
}
return f[a][0];
}
void dfs(int u,int fa){
dp[u]=dp[fa]+1;
for(node i:tr[u]){
int v=i.nxt;
if(v!=fa){
e[v]=e[u]+i.w;
dfs(v,u);
}
}
return;
}
int query1(int u,int v,int m){
if(v==m) return max(a[v],e[u]+e[v]-2*e[m]);
return min(max(a[v],e[u]+e[v]-2*e[m]),query1(u,f[v][0],m));
}
int query2(int u,int v,int m){
if(v==m) return max(a[v],e[u]-e[v]);
return min(max(a[v],e[u]-e[v]),query2(u,f[v][0],m));
}
signed main(){
freopen("poitry.in","r",stdin);
freopen("poitry.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
tr[u].push_back({v,w});
tr[v].push_back({u,w});
f[v][0]=u;
}
dp[0]=0;
dfs(1,0);
while(q--){
int u,v;
cin>>u>>v;
int m=lca(u,v);
cout<<min(query1(u,v,m),query2(u,u,m))<<endl;
}
}