15求助
查看原帖
15求助
561313
orange_dusk楼主2024/5/6 22:59

莫名其妙 15pts求助

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,d;
vector<int> V[300001];
vector<int> W[300001];
int p[300001];
int sum[300001];
int deep[300001];
int l[300001];
int f[300001][31];
struct pj
{
	int dis,u,v,lca;
}a[300001];
inline int read(int &x)//快速读入 
{char ch=getchar();
 int f=1;x=0;
 while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
 while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
 return x*f;
}
void dfs(int u,int fa)
{
	for(int i=0;i<V[u].size();i++)
	{
		int v=V[u][i];
		if(v==fa)
			continue;
		deep[v]=deep[u]+1;
		f[v][0]=u;
		p[v]=W[u][i];
		sum[v]=sum[u]+W[u][i];
		dfs(v,u);
	}
}
int lca(int x,int y)
{
	if(deep[x]<deep[y])
		swap(x,y);
	for(int i=d;i>=0;i--)
		if(deep[x]-(1<<i)>=deep[y])
			x=f[x][i];
	if(x==y)
		return x; 
	for(int i=d;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	x=f[x][0],y=f[y][0];
	return x;
}
bool cmp(pj x,pj y)
{
	return x.dis>y.dis;
}
void dfs1(int u,int fa)
{
	for(int i=0;i<V[u].size();i++)
	{
		int v=V[u][i];
		if(v==fa)
			continue;
		l[u]+=l[v];
		dfs1(v,u);
	}
}
bool check(int mid)
{
	int cnt=0,maxn=-1;
	memset(l,0,sizeof(l));
	for(int i=1;i<=m;i++)
		if(a[i].dis>mid)
		{
			cnt++;
			l[a[i].u]++;
			l[a[i].v]++;
			l[a[i].lca]-=2;
		}
	dfs1(1,0);
	for(int i=2;i<=n;i++)
		if(l[i]==cnt)
			maxn=max(maxn,p[i]);
	if(maxn==-1)
		return 0;
	if(a[1].dis-maxn<=mid)
		return 1;
	return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		read(u),read(v),read(w);
		V[u].push_back(v);
		V[v].push_back(u);
		W[u].push_back(w);
		W[v].push_back(w);
	}
	dfs(1,0);
	while((1<<d)<=n)
		d++;
	for(int i=1;i<=d;i++)
		for(int j=1;j<=n;j++)
			f[j][i]=f[f[j][i-1]][i-1];
	for(int i=1;i<=m;i++)
	{
		read(a[i].u),read(a[i].v);
		a[i].lca=lca(a[i].u,a[i].v);
		a[i].dis=sum[a[i].u]+sum[a[i].v]-2*sum[a[i].lca];
	}
	sort(a+1,a+n+1,cmp);
	int l=0,r=1e9;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(check(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}
2024/5/6 22:59
加载中...