lca 8pts求调
查看原帖
lca 8pts求调
562569
kingho11楼主2024/11/25 16:35
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,q,c[N],dep[N],st[N][25],dis[N];//dis[i]表示1-i的边权之和,dep[i]表示节点i的深度,st[u][i]表示节点u向上跳2^i次方的节点是什么 
struct uuu{
	int v,w;
};
vector <uuu> v[N];
void dfs(int u,int fa,int w)
{
	dep[u]=dep[fa]+1;
	st[u][0]=fa;
	dis[u]=dis[fa]+w;
	for(int i=1;i<=20;i++)
	{
		st[u][i]=st[st[u][i-1]][i-1];
	}
	for(int i=0;i<v[u].size();i++)
	{
		int v2=v[u][i].v,w=v[u][i].w;
		if(v2==fa) continue;
		dfs(v2,u,w);
	}
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--)
	{
		if(dep[st[x][i]]>=dep[y]) x=st[x][i];
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--)
	{
		if(st[x][i]!=st[y][i]) x=st[x][i],y=st[x][i];
	}
	return st[x][0];
}
int dist(int x,int y)
{
	int lca=LCA(x,y);
	return abs(dis[x]-dis[lca])+abs(dis[y]-dis[lca]);
}
int query(int x,int y)
{
	int ans=-1e18;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,c[x]+c[y]+c[i]-dist(x,i)-dist(i,y));
	}
	return ans;
}
signed main()
{
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
	for(int i=1;i<=n-1;i++)
	{
		int u,v2,w;
//		cin>>u>>v2>>w;
		scanf("%lld%lld%lld",&u,&v2,&w);
		v[u].push_back((uuu){v2,w});
		v[v2].push_back((uuu){u,w});
	}
	dfs(1,0,0);
	while(q--)
	{
		int x,y;
//		cin>>x>>y;
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",query(x,y));
//		cout<<query(x,y)<<"\n";
	}
}
2024/11/25 16:35
加载中...