45pts二分+树上差分求助
查看原帖
45pts二分+树上差分求助
754835
JerryjunyiMCer楼主2024/8/13 14:35
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5;
int n,m,a,b,c,L,R;
int d[MAXN+5],u[MAXN+5],v[MAXN+5],len[MAXN+5],la[MAXN+5],
	lst[MAXN+5],depth[MAXN+5],fval[MAXN+5],father[MAXN+5][25];
struct edge
{
	int to;
	int nxt;
	int val;
}e[2*MAXN+5];
int cnt,head[MAXN+5];
void add(int u,int v,int w)
{
	cnt++;
	e[cnt].nxt=head[u];
	e[cnt].to=v;
	e[cnt].val=w;
	head[u]=cnt;
}
void dfs(int x,int f)
{
	d[x]=d[f]+1;
	father[x][0]=f;
	for (int i=1;i<25;i++)
	{
		father[x][i]=father[father[x][i-1]][i-1];
	}
	for (int i=head[x];i!=0;i=e[i].nxt)
	{
		if (e[i].to!=f)
		{
			depth[e[i].to]=depth[x]+e[i].val;
			fval[e[i].to]=e[i].val;
			dfs(e[i].to,x);
		}
	}
}
int lca(int x,int y)
{
	if (depth[x]<depth[y])
	{
		swap(x,y);
	}
	for (int i=24;i>=0;i--)
	{
		if (depth[father[x][i]]>=depth[y])
		{
			x=father[x][i];
		}
	}
	if (x==y)
	{
		return x;
	}
	for (int i=24;i>=0;i--)
	{
		if (father[x][i]!=father[y][i])
		{
			x=father[x][i];
			y=father[y][i];
		}
	}
	return father[x][0];
}
void dfs2(int x,int f)
{
	for (int i=head[x];i!=0;i=e[i].nxt)
	{
		if (e[i].to!=f)
		{
			dfs2(e[i].to,x);
			lst[x]+=lst[e[i].to];
		}
	}
}
bool check(int k)
{
	int t=0,maxn=0;
	memset(lst,0,sizeof(lst));
	for (int i=1;i<=m;i++)
	{
		if (len[i]>k)
		{
			t++;
			lst[u[i]]++;
			lst[v[i]]++;
			lst[la[i]]-=2;
		}
	}
	dfs2(1,0);
	for (int i=1;i<=n;i++)
	{
		if (lst[i]==t)
		{
			maxn=max(maxn,fval[i]);
		}
	}
	for (int i=1;i<=m;i++)
	{
		if (len[i]-maxn>k)
		{
			return 0;
		}
	}
	return 1;
}
int find(int L,int R)
{
	int l=L,r=R,mid,ans;
	while (l<=r)
	{
		mid=(l+r)/2;
		if (check(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n-1;i++)
	{
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
		L=max(L,c);
	}
	dfs(1,0);
	for (int i=1;i<=m;i++)
	{
		cin>>u[i]>>v[i];
		la[i]=lca(u[i],v[i]);
		len[i]=depth[u[i]]+depth[v[i]]-2*depth[la[i]];
		R=max(R,len[i]);
	}
	cout<<find(R-L,R);
    return 0;
}
2024/8/13 14:35
加载中...