MnZn90分,纯LCA求助
查看原帖
MnZn90分,纯LCA求助
263594
寻逍遥2006楼主2022/7/22 19:57
#include <bits/stdc++.h>
using namespace std;
int Qread()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x;
}
struct ys{
	int l,r,len,zx;
}p[300010];
bool cmp(ys a,ys b)
{
	return a.len>b.len;
}
int n,m,i,j,a,b,w,L,R,q;
int l[600010][3],t[300010],dpth[300010],maxdpth;
int f[300010][2],maxn[300010][20],fa[300010][20],sum[300010][20];
int Log[300010];
bool vis[300010];
void dfs(int a)
{
	maxdpth=max(maxdpth,dpth[a]);
	vis[a]=true;
	for(int k=t[a];k!=0;k=l[k][0])
	{
		if(vis[l[k][1]]) continue;
		f[l[k][1]][0]=a;
		f[l[k][1]][1]=l[k][2];
		dpth[l[k][1]]=dpth[a]+1;
		dfs(l[k][1]);
	}
	return;
}
void swap(int &u,int &v)
{
	int temp=u;
	u=v;
	v=temp;
	return;
}
int LCA(int u,int v,int a)
{
	int cnt=0;
	if(dpth[u]<dpth[v]) swap(u,v);
	while(dpth[u]>dpth[v])
	{
		cnt+=sum[u][Log[dpth[u]-dpth[v]]];
		u=fa[u][Log[dpth[u]-dpth[v]]];
	}
	for(int c=Log[maxdpth];c>=0&&u!=v;c--)
	{
		if(fa[u][c]!=fa[v][c])
		{
			cnt+=sum[u][c];
			cnt+=sum[v][c];
			u=fa[u][c];
			v=fa[v][c];
		}
	}
	if(u!=v)
	{
		cnt+=sum[u][0];
		cnt+=sum[v][0];
	}
	if(a!=0)
		p[a].len=cnt;
	if(u!=v) return f[u][0];
	else return u;
}
int find(int u,int v)
{
	int ret=0;
	if(dpth[u]<dpth[v]) swap(u,v);
	while(dpth[u]>dpth[v])
	{
		ret=max(ret,maxn[u][Log[dpth[u]-dpth[v]]]);
		u=fa[u][Log[dpth[u]-dpth[v]]];
	}
	for(int c=Log[maxdpth];c>=0&&u!=v;c--)
	{
		if(fa[u][c]!=fa[v][c])
		{
			ret=max(ret,max(maxn[u][c],maxn[v][c]));
			u=fa[u][c];
			v=fa[v][c];
		}
	}
	if(u!=v)
		ret=max(ret,max(maxn[u][0],maxn[v][0]));
	return ret;
}
void uni(int l1,int r1,int l2,int r2)
{
	int a1=LCA(l1,l2,0),a2=LCA(l1,r2,0),a3=LCA(r1,l2,0),a4=LCA(r1,r2,0);
	if(a1==a2) L=a3,R=a4;
	if(a1==a3) L=a2,R=a4;
	if(a1==a4) L=a2,R=a3;
	if(a2==a3) L=a1,R=a4;
	if(a2==a4) L=a1,R=a3;
	if(a3==a4) L=a1,R=a2;
}
int main()
{
//	freopen("P2680_10.in","r",stdin);
	n=Qread();m=Qread();
	Log[0]=-1;
	for(i=1;i<=n;i++)
	    Log[i]=Log[i>>1]+1;
	for(i=1;i<n;i++)
	{
		a=Qread();b=Qread();w=Qread();
		l[i<<1][0]=t[a];
		l[i<<1][1]=b;
		l[i<<1][2]=w;
		t[a]=i<<1;
		l[(i<<1)-1][0]=t[b];
		l[(i<<1)-1][1]=a;
		l[(i<<1)-1][2]=w;
		t[b]=(i<<1)-1;
	}
	dpth[1]=1;
	dfs(1);
	for(i=0;i<=Log[maxdpth];i++)
	for(j=1;j<=n;j++)
	{
		if(i==0) fa[j][0]=f[j][0],sum[j][0]=maxn[j][0]=f[j][1];
		else fa[j][i]=fa[fa[j][i-1]][i-1],maxn[j][i]=max(maxn[j][i-1],maxn[fa[j][i-1]][i-1]),sum[j][i]=sum[j][i-1]+sum[fa[j][i-1]][i-1];
	}
	for(i=1;i<=m;i++)
	{
		p[i].l=Qread();
		p[i].r=Qread();
		p[i].zx=LCA(p[i].l,p[i].r,i);
	}
	sort(p+1,p+m+1,cmp);
	q=0;
	for(i=1;i<=m;i++)
	{
		if(i==1) L=p[i].l,R=p[i].r;
		else
		{
			uni(L,R,p[i].l,p[i].r);
			if(L==R)
			{
				cout<<p[i].len;
				return 0;
			}
		}
		q=find(L,R);
		if(p[1].len-q>=p[i+1].len)
		{
			cout<<p[1].len-q;
			break;
		}
	}
	if(i==m+1)
		cout<<0;
	return 0;
}
2022/7/22 19:57
加载中...