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