树剖 MLE 求条
查看原帖
树剖 MLE 求条
1418281
nauyng楼主2025/1/2 22:14
#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt,last[500005],xe[500005],v[500005];
int deep[500005],f[500005],ff[500005];
int siz[500005];
int maxx[500005];
void add(int x,int y)
{
	cnt++;
	v[cnt]=y;
	xe[cnt]=last[x];
	last[x]=cnt;
}
inline void qq(register const int &x)
{
	deep[x]=deep[ff[x]]+1;
	siz[x]=1;
	for(register int i=last[x];i;i=xe[i])
	{
		if(v[i]==ff[x])continue;
		ff[v[i]]=x;
		qq(v[i]);
		siz[x]+=siz[v[i]];
		if(siz[v[i]]>siz[maxx[x]])maxx[x]=v[i];
	}
}
inline void qq2(register const int &x,register const int &top)
{
	f[x]=top;
	if(maxx[x]!=0)qq2(maxx[x],top);
	for(register int i=last[x];i;i=xe[i])
		if(v[i]!=maxx[x]&&v[i]!=ff[x])
			qq2(v[i],v[i]);
}
inline int LCA(register int &x,register int &y)
{
	while(f[x]!=f[y])
		if(deep[f[x]]>deep[f[y]])
			x=ff[f[x]];
		else
			y=ff[f[y]];
	return deep[x]>deep[y]?y:x;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int S;
	cin>>n>>m>>S;
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	qq(S);
	qq2(S,S);
	for(int i=1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<'\n';
	}
}
2025/1/2 22:14
加载中...