树板子
题解:照着写树板子
#include<bits/stdc++.h> using namespace std; using LL=long long; const int N=30; const int maxN=1e5+5; int n,m; int a[maxN],dep[maxN]; int f[N][maxN]; LL sum[maxN]; vector<int > adj[maxN]; void DFS(int u) { for(int i=1;i<N;i++) f[i][u]=f[i-1][f[i-1][u]]; for(int v:adj[u]) { if(v!=f[0][u]) { f[0][v]=u; dep[v]=dep[u]+1; sum[v]=sum[u]+a[v]; DFS(v); } } } int Jump(int u,int t) { for(int i=0;i<N;i++) if(t>>i&1) u=f[i][u]; return u; } int LCA(int u,int v) { if(dep[u]<dep[v]) swap(u,v); u=Jump(u,dep[u]-dep[v]); if(u==v) return u; for(int i=N-1;i>=0;i--) if(f[i][u]!=f[i][v]) u=f[i][u],v=f[i][v]; return f[0][u]; } int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++) { int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } dep[1]=1; sum[1]=a[1]; DFS(1); while(m--) { int u,v,lca; cin>>u>>v; lca=LCA(u,v); cout<<sum[u]+sum[v]-2*sum[lca]+a[lca]<<endl; } return 0; }