60分求救
查看原帖
60分求救
362762
lzyzs楼主2023/10/8 16:59
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10,Log=22;
const long long MAXX=3e18;
int n,k,q;
long long v[N],minson[N];
int fa[N][Log];
int deg[N];
struct edge{
	long long a[3][3];
	void claer()
	{
		for(int i=0;i<k;i++) for(int j=0;j<k;j++) a[i][j]=MAXX;
		for(int i=0;i<k;i++) a[i][i]=0;
	}
	void pout()
	{
		for(int i=0;i<k;i++)
		{
			for(int j=0;j<k;j++)
			{
				if(a[i][j]!=2e9)printf("%d ",a[i][j]);
				else printf("+ ");
			}
			printf("\n");
		}
		printf("\n");
		printf("\n");
	}
	edge operator*(edge &x) const{
		edge c;
		for(int i=0;i<k;i++)
		{
			for(int j=0;j<k;j++)
			{
				c.a[i][j]=MAXX;
				for(int l=0;l<k;l++)
				{
					c.a[i][j]=min(c.a[i][j],a[i][l]+x.a[l][j]);
				}
			}
		}
		return c;
	}
};
edge mat[N][Log];
edge fmat[N][Log];
edge ben[N];
edge atf,ftb;
vector<int> ma[N];
void dfs(int u)
{
	deg[u]=deg[fa[u][0]]+1;
	minson[u]=MAXX;
	for(int i=1;i<Log;i++)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=0;i<ma[u].size();i++)
	{
		minson[u]=min(minson[u],v[ma[u][i]]);
		if(ma[u][i]==fa[u][0]) continue;
		fa[ma[u][i]][0]=u; 
		dfs(ma[u][i]);
	}
}
void dfs2(int u)
{
	if(k==1) 
	{
		ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
	}
	else if(k==2)
	{
		ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
		ben[u].a[0][1]=fmat[u][0].a[0][1]=mat[u][0].a[0][1]=v[u];
		
		ben[u].a[1][0]=fmat[u][0].a[1][0]=mat[u][0].a[1][0]=0;
		ben[u].a[1][1]=fmat[u][0].a[1][1]=mat[u][0].a[1][1]=MAXX;
	}
	else if(k==3)
	{
		ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
		ben[u].a[0][1]=fmat[u][0].a[0][1]=mat[u][0].a[0][1]=v[u];
		ben[u].a[0][2]=fmat[u][0].a[0][2]=mat[u][0].a[0][2]=v[u];
		
		ben[u].a[1][0]=fmat[u][0].a[1][0]=mat[u][0].a[1][0]=0;
		ben[u].a[1][1]=fmat[u][0].a[1][1]=mat[u][0].a[1][1]=minson[u];
		ben[u].a[1][2]=fmat[u][0].a[1][2]=mat[u][0].a[1][2]=minson[u];
		
		ben[u].a[2][0]=fmat[u][0].a[2][0]=mat[u][0].a[2][0]=MAXX;
		ben[u].a[2][1]=fmat[u][0].a[2][1]=mat[u][0].a[2][1]=0;
		ben[u].a[2][2]=fmat[u][0].a[2][2]=mat[u][0].a[2][2]=MAXX;
	}
	mat[u][0]=ben[fa[u][0]];
	for(int r=1;r<Log;r++)
	{
		if(!fa[u][r-1]||!fa[fa[u][r-1]][r-1]) continue;
		fmat[u][r]=fmat[u][r-1]*fmat[fa[u][r-1]][r-1];
		mat[u][r]=mat[fa[u][r-1]][r-1]*mat[u][r-1];
	}
	for(int i=0;i<ma[u].size();i++)
	{
		if(ma[u][i]==fa[u][0]) continue;
		dfs2(ma[u][i]);
	}
}
void lca(int a,int b)
{
	if(deg[b]>deg[a]) swap(a,b);
	long long ben1=v[a];
	atf.claer();ftb.claer();
	for(int i=Log-1;i>=0;i--)
	{
		if(deg[fa[a][i]]>=deg[b]) 
		{
			atf=mat[a][i]*atf;
			a=fa[a][i];
		}
	}
	if(a==b) return void(printf("%lld\n",atf.a[0][0]+ben1));	
	for(int i=Log-1;i>=0;i--)
	{
		if(fa[a][i]!=fa[b][i]) 
		{
			atf=mat[a][i]*atf;
			ftb=ftb*fmat[b][i];
			a=fa[a][i],b=fa[b][i];
		}
	}
	atf=ftb*ben[b]*ben[fa[a][0]]*atf;
	printf("%lld\n",atf.a[0][0]+ben1);
}
signed main()
{
	cin >> n >> q >> k;
	for(int i=1;i<=n;i++) cin >> v[i];
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin >> x >> y;
		ma[x].push_back(y);
		ma[y].push_back(x);
	}
	dfs(1);
	dfs2(1);
	while(q--)
	{
		int x,y;
		cin >> x >> y;
		lca(x,y);
	}
	return 0;
}
/*
7 3 2
1 2 3 4 5 6 7
1 2
2 3
3 4
4 5
5 6
6 7

4 6
5 6
1 2
*/

record

2023/10/8 16:59
加载中...