玄关,RE95分
查看原帖
玄关,RE95分
996300
CMY2013楼主2025/1/23 17:17
#include<bits/stdc++.h>
using namespace std;

struct node
{
	int v,w,ne;
 }ee[600010];

int n,m,tot=0,dis[300010],a[300010],b[300010],hd[300010],cf[300010],f[300010][25],siz[300010],ft[300010],mni[300010][25];
bool vis[300010];

void add(int u,int v,int w)
{
	++tot;
	ee[tot].v=v;
	ee[tot].w=w;
	ee[tot].ne=hd[u];
	hd[u]=tot;
}

int find(int x)
{
    if(ft[x]==x) return x;
    ft[x]=find(ft[x]);
    return ft[x];
}

void dfs(int u)
{
	vis[u]=true;
	for(int i=hd[u];i;i=ee[i].ne)
	{
		if(!vis[ee[i].v])
		{
			siz[ee[i].v]=siz[u]+1;
			f[ee[i].v][0]=u;
			mni[ee[i].v][0]=ee[i].w;
			dfs(ee[i].v);
		}
	}
}

int sum(int l,int r)
{
	int ans=0;
	if(siz[l]<siz[r]) swap(l,r);
	for(int i=20;i>=0;i--) if(siz[f[l][i]]>=siz[r]) ans+=mni[l][i],l=f[l][i];
	if(l==r) return ans;
	for(int i=20;i>=0;i--) if(f[l][i]!=f[r][i]) ans+=mni[l][i]+mni[r][i],l=f[l][i],r=f[r][i];
	return ans+mni[l][0]+mni[r][0];
}

int lca(int l,int r)
{
	if(siz[l]<siz[r]) swap(l,r);
	for(int i=20;i>=0;i--) if(siz[f[l][i]]>=siz[r]) l=f[l][i];
	if(l==r) return l;
	for(int i=20;i>=0;i--) if(f[l][i]!=f[r][i]) l=f[l][i],r=f[r][i];
	return f[l][0];
}

void cha(int u)
{
	vis[u]=true;
	for(int i=hd[u];i;i=ee[i].ne)
	{
		if(!vis[ee[i].v])
		{
			cha(ee[i].v);
			cf[u]+=cf[ee[i].v];
			ft[i]=cf[ee[i].v];
		}
	}
}

int main()
{
    cin>>n>>m;
    int u,v,w;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	} 
	siz[1]=1;
	f[1][0]=1;
	dfs(1);
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
			mni[i][j]=mni[i][j-1]+mni[f[i][j-1]][j-1];
		}
	} 
	int maxx=0,mxa=0;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i]>>b[i];
		dis[i]=sum(a[i],b[i]);
		maxx=max(maxx,dis[i]);
	}
	for(int i=1;i<=2*(n-1);i++) mxa=max(mxa,ee[i].w);
	int l=maxx-mxa,r=300000000,ans=0x7f7f7f7f;
    while(l<=r)
    {
    	int mid=(l+r)>>1;
    	memset(ft,0,sizeof(ft));
    	memset(cf,0,sizeof(cf));
    	memset(vis,false,sizeof(vis));
    	int cnt=0;
    	for(int i=1;i<=m;i++)
    	{
    		if(dis[i]>mid)
    		{
    			cf[a[i]]++;
    			cf[b[i]]++;
    			cf[lca(a[i],b[i])]-=2;
    			cnt++;
			}
		}
		if(cnt==0)
		{
			ans=min(ans,mid);
			r=mid-1;
			continue;
		}
		cha(1);
		int maxn=0;
		for(int i=1;i<=2*(n-1);i++) if(ft[i]==cnt) maxn=max(maxn,ee[i].w);
		if(maxx-maxn<=mid)
		{
			ans=min(ans,mid);
			r=mid-1;
		}
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}
2025/1/23 17:17
加载中...