【违规紫衫】站外题求助
  • 板块灌水区
  • 楼主sunlight2048
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/5/7 23:03
  • 上次更新2023/11/4 23:34:03
查看原帖
【违规紫衫】站外题求助
445782
sunlight2048楼主2021/5/7 23:03

实在不敢发学术,就发灌水了

就这道题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 
const int MAXN=2e4+5;
struct e{
    int to,k;
};
vector<ll> a[MAXN],kk[MAXN];
ll n,m,f[MAXN][20],sh[MAXN],qf[MAXN][20];
void dfs(int no,int fa,int k){
    sh[no]=sh[fa]+1;
    f[no][0]=fa,qf[no][0]=k;
    for(int i=1;i<=19;++i){
        f[no][i]=f[f[no][i-1]][i-1];
        qf[no][i]=qf[no][i-1]+qf[qf[no][i-1]][i-1];
    }
    for(int i=0;i<a[no].size();++i){
        if(a[no][i]==fa)continue;
        dfs(a[no][i],no,kk[no][i]);
    }
}
ll lca(ll x,ll y){
    ll ans=0;
    if(sh[y]>sh[x])swap(x,y);
    for(int i=19;i>=0;--i){
        if(sh[f[x][i]]>=sh[y]){
            ans+=qf[x][i];
            x=f[x][i];
        }
    }
    if(x==y)return ans;
    for(int i=19;i>=0;--i){
        if(f[x][i]!=f[y][i]){
            ans+=qf[x][i]+qf[y][i];
            x=f[x][i];
            y=f[y][i];
        }
    }
    return ans+qf[x][0]+qf[y][0];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<n;++i){
        ll x,y,k;
        scanf("%lld%lld%lld",&x,&y,&k);
        a[x].push_back(y);
        kk[x].push_back(k);
        a[y].push_back(x);
        kk[y].push_back(k);
    }
    dfs(1,0,0);
    while(m--){
        ll x,y;
        scanf("%lld%lld",&x,&y);
        printf("%lld\n",lca(x,y));
    }
    return 0;
}

2021/5/7 23:03
加载中...