倍增lca板子求调
  • 板块灌水区
  • 楼主Surge_of_Force
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/10/2 17:53
  • 上次更新2023/11/4 05:07:39
查看原帖
倍增lca板子求调
230875
Surge_of_Force楼主2021/10/2 17:53

马蜂清奇,不要在意

#include<bits/stdc++.h>
#define ll long long
const int MAX=5e5;
using namespace std;
int maxx=-1e9;
inline int read()
{
	char qwqc=getchar();
	int qwqf=1,qwqx=0;
	while(qwqc<'0'||qwqc>'9')
	{
		if(qwqc=='-') qwqf=-1;
		qwqc=getchar();
	}
	while(qwqc>='0'&&qwqc<='9')
	{
		qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
		qwqc=getchar();
	}
	return qwqf*qwqx;
}
inline void write(ll x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
vector<int> edge[MAX];
int deep[MAX],fa[MAX][20],bz[MAX];
int lg[20];
inline void dfs(int s)
{
	int siz=edge[s].size();	
	for(int i=0;i<siz;i++)
	{
		if(bz[edge[s][i]]) continue;
		fa[edge[s][i]][0]=s;
		deep[edge[s][i]]=deep[s]+1;
		for(int j=1;j<=lg[edge[s][i]];j++)
			fa[edge[s][i]][j]=fa[fa[edge[s][i]][j-1]][j-1];
		bz[edge[s][i]]=1;
		dfs(edge[s][i]);
	}
}
inline int lca(int x,int y)
{
	if(deep[x]<deep[y]) {x^=y;y^=x;x^=y;}
	while(deep[x]>deep[y]) x=fa[x][lg[deep[x]-deep[y]]];
	if(x==y) return x;
	for(int i=lg[deep[x]]-1;i>=0;i--)
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	return fa[x][0];
}
int main()
{ 
	int n=read(),m=read(),s=read();
	deep[s]=1;bz[s]=1;
	for(int i=1;i<=n;i++)
		lg[i]=log2(i);
	for(int i=1;i<n;i++)
	{
		int x=read(),y=read();
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	dfs(s);
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		write(lca(x,y));
		putchar('\n');
	}
	return 0;
}
2021/10/2 17:53
加载中...