LCA求调,十分感谢,期望得分36分,但是只有20分
查看原帖
LCA求调,十分感谢,期望得分36分,但是只有20分
556950
hyf__楼主2024/11/25 00:00
#include <bits/stdc++.h>

using namespace std;
template <typename T>
inline void in(T &x){
	int f=1;char c;
	do{
		c=getchar();
		f=c=='-'?-1:f;
	}while(c<'0'||c>'9');
	for(x=0;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x*=f;
}

const int N=200005;

int n,q;
int a[200005],dep[N],fa[18][N];
long long cost[18][N];
int tot,head[N],ver[N<<1],nxt[N<<1],edge[N<<1];

inline void add(int x,int y,int z){
	ver[++tot]=y,edge[tot]=z;
	nxt[tot]=head[x],head[x]=tot;
}

inline void dfs(int x,int f){
	dep[x]=dep[f]+1;
	fa[0][x]=f;
	for(int i=1;i<18;++i){
		fa[i][x]=fa[i-1][fa[i-1][x]];
		cost[i][x]=cost[i-1][fa[i-1][x]]+cost[i-1][x];
	}
	for(int i=head[x];i;i=nxt[i]){
		if(ver[i]==f) continue;
		cost[0][ver[i]]=edge[i];
		dfs(ver[i],x);
	}
}

inline long long lca(int x,int y){
	long long ans=a[x]+a[y];
	if(x==y) return ans;
	if(dep[x]>dep[y]) swap(x,y);
	int tmp=dep[y]-dep[x];
	for(int i=0;i<18;++i){
		if(tmp&(1<<i)){
			ans-=cost[i][y];
			y=fa[i][y];
		}
	}
	if(x==y) return ans;
	for(int i=17;i>=0;--i){
		if(fa[i][x]!=fa[i][y]){
			ans-=cost[i][x];
			ans-=cost[i][y];
			x=fa[i][x];
			y=fa[i][y];
		}
	}
	ans-=cost[0][x];
	ans-=cost[0][y];
	return ans;
}

int main(){
	in(n),in(q);
	for(int i=1;i<=n;++i) in(a[i]);
	for(int i=1,x,y,z;i<n;++i){
		in(x),in(y),in(z);
		add(x,y,z);add(y,x,z);
	}
	dfs(1,0);
	while(q--){
		int x,y;
		long long sum=-0x3f3f3f3f;
		in(x),in(y);
		for(int i=1;i<=n;++i){
//			if(sum<lca(x,i)+lca(i,y)){
//				printf("%d->%d->%d\n",x,i,y);
//			}
			sum=max(sum,lca(x,i)+lca(i,y)-a[i]);
		}
		printf("%lld\n",sum);
	}
	return 0;
}
2024/11/25 00:00
加载中...