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