树板子

 

 

 

 题解:照着写树板子

#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;
}

 

posted @ 2023-03-26 20:40  王浩泽  阅读(13)  评论(0编辑  收藏  举报