RE+TLE求助
查看原帖
RE+TLE求助
43144
jwkljwkl楼主2022/10/25 15:51
#include<bits/stdc++.h>
using namespace std;
const long long inf=100000000000;
long long n,m,k,mid,a[805],dep[805],mn[805],s[805],f[805][25],dp[805][805];
bool leaf[805];
vector<long long>v[805];
long long ss(long long x,long long fa)
{
	f[x][0]=fa;
	for(long long i=1;f[x][i-1];i++)
	{
		f[x][i]=f[f[x][i-1]][i-1];
	}
	dep[x]=dep[fa]+1;
	bool ff=true;
	for(auto y:v[x])
	{
		if(y==fa)continue;
		ff=false;
		ss(y,x);
	}
	leaf[x]=ff;
}
long long getlca(long long x,long long y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(long long i=10;i>=1;i--)
	{
		if(dep[x]-(1<<i)>=dep[y])
		{
			x=f[x][i];
		}
	}
	if(x==y)return x;
	for(long long i=10;i>=1;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
void tt(long long x,long long fa)
{
	for(auto y:v[x])
	{
		if(y==fa)continue;
		tt(y,x);
		s[x]+=s[y];
	}
}
void solve(long long dep,long long x,long long fa)
{
	mn[x]=inf;
	for(auto y:v[x])
	{
		if(y==fa)continue;
		solve(dep+1,y,x);
	}
	for(long long i=1;i<=n;i++)
	{
		dp[x][i]=0;
		if(leaf[x])
		{
			if(a[x]>=a[i]&&a[x]<=a[i]+mid)
			{
				dp[x][i]=0;
				mn[x]=0;
			}
			else dp[x][i]=inf;
			continue;
		}
		if(a[x]<a[i]||a[x]>a[i]+mid)
		{
			dp[x][i]=inf;
			continue;
		}
		for(auto y:v[x])
		{
			if(y==fa)continue;
			dp[x][i]=dp[x][i]+min(s[y]+mn[y],dp[y][i]);
		}
		mn[x]=min(mn[x],dp[x][i]);
	}
}
void read(long long &s)
{
	s=0;
	char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))
	{
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
}
void write(long long x)
{
	if(!x)return;
	write(x/10);
	putchar(x%10+48);
}
int main()
{
	read(n);read(m);read(k);
	for(long long i=1;i<=n;i++)read(a[i]);
	for(long long i=1;i<n;i++)
	{
		long long x,y;
		read(x);read(y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	ss(1,0);
	for(long long i=1;i<=m;i++)
	{
		long long x,y;
		cin>>x>>y;
		long long lca=getlca(x,y);
		s[lca]-=2;
		s[x]++;
		s[y]++;
	}
	tt(1,0);
	long long l=0,r=1e9;
	while(l<r)
	{
		mid=(l+r)/2;
		solve(0,1,0);
		if(mn[1]<=k)r=mid;
		else l=mid+1;
	}
	if(!l)puts("0");
	else write(l);
	putchar(10);
	return 0;
}
2022/10/25 15:51
加载中...