| 比赛 |
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;
}