为何nq做法假了
查看原帖
为何nq做法假了
235901
Always_Remember_It楼主2024/11/24 16:00

Rt,才20pts

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+10;
int c[N],head[N],tot,d[3][N];
bool vis[N];
struct Edge{
	int nxt,to,val;
}e[N];
void adde(int u,int v,int w){
	e[++tot].nxt=head[u];
	e[tot].to=v;
	e[tot].val=w;
	head[u]=tot;
	return;
}
void dfs(int s,int id){
	for(int i=head[s];i;i=e[i].nxt){
		int v=e[i].to,w=e[i].val;
		if(vis[v]) continue;
		vis[v]=1;
		d[id][v]=d[id][s]+w;
		dfs(v,id);
	}
	return;
}
signed main(){
	//freopen("speaker2.in","r",stdin);
	//freopen("speaker2.out","w",stdout);
	int n,q;cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>c[i];
	}
	for(int i=1;i<n;i++){
		int u,v,w;cin>>u>>v>>w;
		adde(u,v,w);
		adde(v,u,w);
	}
	while(q--){
		for(int i=1;i<=n;i++){
			d[1][i]=d[2][i]=0;
		}
		int x,y;cin>>x>>y;
		memset(vis,0,sizeof(vis));
		vis[x]=1;
		dfs(x,1);
		memset(vis,0,sizeof(vis));
		vis[y]=1;
		dfs(y,2);
		int maxn=-2e9-10;
		for(int i=1;i<=n;i++){
			//cout<<d[1][i]<<" ";
			maxn=max(maxn,c[i]-d[1][i]-d[2][i]);
		}
		//cout<<endl;
		cout<<maxn+c[x]+c[y]<<endl;
	}
	return 0;
}
2024/11/24 16:00
加载中...