13pts 求调或hack
查看原帖
13pts 求调或hack
1078013
qsn123楼主2024/11/6 18:14
#include<bits/stdc++.h>
using namespace std;
const int N=888,inf=1000000000;
vector< pair<int,int> >tre[N];
int fa[N][66],mn[N],dp[N][N],val[N],d[N],cnt[N];
void dfs_1(int x)
{
	for(int i=0;i<tre[x].size();i++)
	{
		int y=tre[x][i].first;
		if(y==fa[x][0])continue;
		fa[y][0]=x;
		dfs_1(y);
	}
	return ;
}
void dfs_2(int x)
{
	for(int i=0;i<tre[x].size();i++)
	{
		int y=tre[x][i].first;
		if(y==fa[x][0])continue;
		fa[y][0]=x;
		dfs_2(y);
		tre[x][i].second=cnt[y];
		cnt[x]+=cnt[y];
	}
	return ;
}
int LCA(int x,int y)
{
	if(d[x]<d[y])swap(x,y);
	for(int i=32;i>=0;i--){
		if(d[x]==d[y])break;
		if(d[fa[x][i]]>=d[y])x=fa[x][i];
	}
	if(x==y)return x;
	for(int i=32;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		}
	}
	return fa[x][0];
}
void work(int x,int p,int n)
{
	for(int i=0;i<tre[x].size();i++){
		int y=tre[x][i].first;
		if(y==fa[x][0])continue;
		work(y,p,n);
	}
	for(int i=1;i<=n;i++){
		if(val[i]<=val[x]&&val[x]<=val[i]+p){
			for(int j=0;j<tre[x].size();j++){
				int y=tre[x][j].first,z=tre[x][j].second;
				if(y==fa[x][0])continue;
				dp[x][i]=dp[x][i]+min(dp[y][i],mn[y]+z);
			}
		}
		else dp[x][i]=inf;
	}
	mn[x]=inf;
	for(int i=1;i<=n;i++)mn[x]=min(mn[x],dp[x][i]);
	return ;
}
int main()
{
	int n,m,k,x,y;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)scanf("%d",&val[i]);
	for(int i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		tre[x].push_back(make_pair(y,0));
		tre[y].push_back(make_pair(x,0));
	}
	dp[1]=1;
	dfs_1(1);
	for(int i=1;i<=32;i++){
		for(int j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		cnt[x]++;
		cnt[y]++;
		cnt[LCA(x,y)]-=2;
	}
	dfs_2(1);
	int l=0,r=1e9;
	while(l<r){
		memset(dp,0,sizeof(dp));
		memset(mn,0,sizeof(mn));
		int mid=(l+r)/2;
		work(1,mid,n);
		if(mn[1]>k)l=mid+1;
		else r=mid;
	}
	printf("%d",l);
	return 0;
}

评测记录

2024/11/6 18:14
加载中...