比赛 CSP2023-S模拟赛 评测结果 AAAAAAAAATTTTTTTTTTT
题目名称 坡伊踹 最终得分 45
用户昵称 小金 运行时间 34.679 s
代码语言 C++ 内存使用 31.26 MiB
提交时间 2023-10-17 21:42:03
显示代码纯文本
#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int f[200010][25]={},d[200010]={},v[400010]={},n[400010]={},e[400010]={},h[400010]={},n2,m,tot,t,k;
long long dist[200010]={},a[200010]={},mi,gg;
queue<int> q;
void add(int x,int y,int z)
{
    tot++;
    v[tot]=y;
    e[tot]=z;
    n[tot]=h[x];
    h[x]=tot;
}
void bfs()
{
    q.push(1);
    d[0]=0;
    d[1]=1;
    dist[1]=0;
    while(q.size())
    {
        int x=q.front();
        q.pop();
        for(int i=h[x];i;i=n[i])
        {
            int y=v[i];
            if(d[y])
            {
                continue;
            }
            d[y]=d[x]+1;
            dist[y]=(long long)dist[x]+e[i];
            f[y][0]=x;
            for(int j=1;j<=t;j++)
            {
                f[y][j]=f[f[y][j-1]][j-1];
            }
            q.push(y);
        }
    }
}
int lca(int x,int y)
{
    if(d[x]>d[y])
    {
        swap(x,y);
    }
    for(int i=t;i>=0;i--)
    {
        if(d[f[y][i]]>=d[x])
        {
            y=f[y][i];
        }
    }
    if(x==y)
    {
        return x;
    }
    for(int i=t;i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}
void p(int x,int u)
{
    long long ans=dist[x]+dist[u]-2*dist[lca(x,u)];
    long long fl=max(a[x],ans);
    if(fl<mi)
    {
        mi=fl;
    }
    if(x==gg)
    {
        return;
    }
    p(f[x][0],u);
}
int main()
{
    freopen("poitry.in","r",stdin);
    freopen("poitry.out","w",stdout);
    cin>>n2>>m;
    t=(int)(log(n2)/log(2))+1;
    for(int i=1;i<=n2;i++)
    {
        h[i]=0;
        d[i]=0;
    }
    tot=0;
    for(int i=1;i<=n2;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<n2;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    bfs();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        mi=0x3f3f3f3f3f3f3f3f;
        gg=lca(x,y);
        p(x,x);
        p(y,x);
        cout<<mi<<endl;
    }
    return 0;
}