比赛 CSP2023-S模拟赛 评测结果 TTTTATWWWWWWWWWWWWWW
题目名称 坡伊踹 最终得分 5
用户昵称 健康铀 运行时间 21.849 s
代码语言 C++ 内存使用 18.55 MiB
提交时间 2023-10-17 21:16:32
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,q,ans,nm[1010][1010],b[200010],a[200010],c[200010];
int main(){
    freopen("poitry.in","r",stdin);
    freopen("poitry.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    if(n>1000){
        c[1]=0;
        for(int i=1;i<=n-1;i++){
            int x,y,z;
            cin>>x>>y>>z;
            b[y]=x;
            c[y]=c[x]+z;
        }
        while(q--){
            int x,y;
            cin>>x>>y;
            long long d1[200010],top=1,ans=INT_MAX;
            d1[1]=y;
            while(y==1){
                y=b[y];
                top++;
                d1[top]=y;
            }
            for(int i=1;i<=top;i++){
                ans=min(max(a[d1[i]],c[d1[i]]),ans);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    c[1]=1;
    for(int i=1;i<=n-1;i++){
        int x,y,z;
        cin>>x>>y>>z;
        b[y]=x;
        c[y]=c[x]+1;
        nm[y][x]=z;
        nm[x][y]=z;
    }
    while(q--){
        long long x,y,z1=0,z2=0,d1[1010],d2[1010],to1=1,to2=1,qz[1010];
        cin>>x>>y;
        z1=x,z2=y;
        qz[0]=0;
        d1[1]=x;
        d2[1]=y;
        while(z1!=z2){
            if(z1!=1&&c[z1]>=c[z2]){
                to1++;
                qz[to1]=qz[to1-1]+nm[z1][b[z1]];
                z1=b[z1];
                d1[to1]=z1;
            }
            if(z2!=1&&c[z2]>c[z1]){
                z2=b[z2];
                to2++;
                d2[to2]=z2;
            }
        }
        for(int i=to2-1;i>=1;i--){
            to1++;
            d1[to1]=d2[i];
            qz[to1]=qz[to1-1]+nm[d1[to1-1]][d1[to1]];
        }
        long long ans=INT_MAX;
        for(int i=1;i<=to1;i++){
            ans=min(max(a[d1[i]],qz[i]),ans);
        }
        cout<<ans<<endl;
    }
    return 0;
}