比赛 2025.10.24 评测结果 AAAAAAAAATTTTTTTTTTT
题目名称 坡伊踹 最终得分 45
用户昵称 淮淮清子 运行时间 44.607 s
代码语言 C++ 内存使用 13.56 MiB
提交时间 2025-10-24 10:11:09
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 2e5 + 10;
const ll INF = 1e18;

int n, q, a[N];
vector<pair<int, int> > e[N];
ll d[N], pre[N];
bool star = 1, chain = 1;
ll dist[N];
int node[N];
vector<int> path;

int main(){
    freopen("poitry.in", "r", stdin);
	freopen("poitry.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    for(int i = 1, u, v, w;i < n;i ++){
        cin >> u >> v >> w;
        e[u].emplace_back(v, w);
        e[v].emplace_back(u, w);
        if(u != 1) star = 0;
        if(v != u + 1) chain = 0;
        if(chain) pre[v] = pre[u] + w;
        if(star && u == 1) d[v] = w;
    }
    d[1] = 0;
    while(q --){
        int u, v; cin >> u >> v;
        if(u == v){
            cout << a[u] << '\n';
            continue;
        }
        ll ans = INF;
        if(star){
            int p[3] = {u, 1, v};
            for(int i = 0;i < 3;i ++){
                int x = p[i]; ll dis;
                if(x == u) dis = 0;
                else if(x == 1) dis = d[u];
                else dis = d[u] + d[v];
                ans = min(ans, max((ll)a[x], dis));
            }
        }
		else if(chain){
            int l = min(u, v), r = max(u, v);
            for(int x = l;x <= r;x ++){
                ll dist = abs(pre[x] - pre[u]);
                ans = min(ans, max((ll)a[x], dist));
            }
        }
		else{
            memset(dist, -1, sizeof(ll) * (n + 1));
            memset(node, -1, sizeof(int) * (n + 1));
            queue<int> q; q.push(u);
            dist[u] = 0; path.clear();
            while(!q.empty()){
                int u = q.front(); q.pop();
                if(u == v) break;
                for(auto p : e[u]){
                    int v = p.first, w = p.second;
                    if(dist[v] == -1){
                        dist[v] = dist[u] + w;
                        node[v] = u;
                        q.push(v);
                    }
                }
            }
            for(int x = v;x != -1;x = node[x]) path.push_back(x);
            reverse(path.begin(), path.end());
            for(int x : path) ans = min(ans, max((ll)a[x], dist[x]));
        }
        cout << ans << '\n';
    }
    return 0;
}