树链剖分lca 20pts 求调
查看原帖
树链剖分lca 20pts 求调
342494
wxh666楼主2023/6/5 10:21

20pts记录

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
namespace lsq{
	typedef int lsqxx;
	struct lq{
			struct lqbz{
			    lsqxx v,nxt;
			}e[1000005];
			lsqxx h[500005],cnt;
			void add(lsqxx u,lsqxx v)
			{
				e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
			}
			#define F(z,u) for(int j=z.h[u],v=z.e[j].v;j;j=z.e[j].nxt,v=z.e[j].v)
	};
};
using namespace lsq;
lq q;
int x,y;
struct d{
	int fa,d,size;
	int bigs_xh;
	bool bigs; 
	int top;
}e[500005];
void dfs1(int t)
{
	int maxx=0,md=0;
	e[t].size=1;
	F(q,t)
	{
		if(e[v].d) continue;
		e[v].fa=t;
		e[v].d=e[t].d+1;
		dfs1(v);
		if(maxx<e[v].size)
			e[t].bigs_xh=v,
			maxx=e[v].size,
			e[v].bigs=1,
			e[md].bigs=0,
			md=e[v].size;
		e[t].size+=e[v].size;
	}
}
void dfs2(int t)
{
	if(e[t].bigs) e[t].top=e[e[t].fa].top;
	else e[t].top=t;
	F(q,t)
	{
		if(e[v].d<=e[t].d) continue;
		dfs2(v);
	}
}
int lca(int x,int y)
{
	if(e[x].top==e[y].top)
		if(e[x].d<e[y].d)
			return x;
		else
			return y;
	if(e[e[x].top].d<e[e[y].top].d)
		return lca(x,e[e[y].top].fa);
	else
		return lca(e[e[x].top].fa,y);
}
int main()
{
	cin>>n>>m>>s;
	for(int _=2;_<=n;_++)
		scanf("%d%d",&x,&y),q.add(x,y),q.add(y,x);
	e[s].d=1;
	e[s].fa=s;
	dfs1(s);
	dfs2(s);
	for(int i=1;i<=m;i++)
		scanf("%d%d",&x,&y),printf("%d\n",lca(x,y));
	return 0;
}
2023/6/5 10:21
加载中...