明明可以过2000的大样例为啥0分
查看原帖
明明可以过2000的大样例为啥0分
897873
lwthree楼主2024/11/24 13:25

rt

#include <bits/stdc++.h>
using namespace std;

int n,q;
struct edge{
    int to,nxt,val;
}e[400050];
int c[200050];
int h[200050];
int dis[200050][21];

int tot;
void add(int u,int v,int w){
    e[++tot].to=v;
    e[tot].val=w;
    e[tot].nxt=h[u];
    h[u]=tot;
}
int d[200050],anc[200050][21];

void dfs(int u,int fa){
    for (int i=h[u];i;i=e[i].nxt){
        int v=e[i].to;
        if (v==fa) continue;
        d[v]=d[u]+1;
        anc[v][0]=u;
        dis[v][0]=e[i].val;
        // cout<<"v:"<<v<<"dis[v][0]:"<<dis[v][0]<<endl;
        dfs(v,u);
    }
}

void init(){
    for (int i=1;i<=20;i++){
        for (int j=1;j<=n;j++){
            anc[j][i]=anc[anc[j][i-1]][i-1];
            if (anc[j][i]!=0)
                dis[j][i]=dis[j][i-1]+dis[anc[j][i-1]][i-1];
        }
    }
}

int LCA(int x, int y){
    if (x==y) return 0;
    // cout<<"x:"<<d[x]<<" y:"<<d[y]<<"   t   ";
    if (d[x]<d[y]){
        swap(x,y);
    }
    int len=0;
    for (int i=20;i>=0;i--){
        if (d[anc[x][i]]>=d[y]){
            len+=dis[x][i];
            x=anc[x][i];

        }
    }
    if (x==y) return len;
    for (int i=20;i>=0;i--){
        if (anc[x][i]!=anc[y][i]){
            len+=dis[x][i],len+=dis[y][i];
            x=anc[x][i],y=anc[y][i];
        }
    }
    len+=dis[x][0],len+=dis[y][0];
    return len;
}

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n>>q;
    for (int i=1;i<=n;i++){
        cin>>c[i];
    }
    for (int i=1;i<=n-1;i++){
        int tu,tv,tw;
        cin>>tu>>tv>>tw;
        add(tu,tv,tw);
        add(tv,tu,tw);
    }
    d[1]=1;
    dfs(1,0);
    init();
    for (int i=1;i<=q;i++){
        int x,y;
        cin>>x>>y;
        int ans=INT32_MIN;
        for (int j=1;j<=n;j++){
            ans=max(ans,c[j]+c[x]+c[y]-LCA(x,j)-LCA(j,y));
        }
        cout<<ans<<"\n";
    }
}
2024/11/24 13:25
加载中...