RMQ求调,感谢大佬~~~
查看原帖
RMQ求调,感谢大佬~~~
480765
bayerfans楼主2023/3/25 22:14
#include<bits/stdc++.h>
using namespace std;
int n,m,r,cen[500005];
vector<int> a[500005];
int f[500005][30];
bool flag[500005];
void unit(int l,int zx){
	cen[l]=cen[zx]+1;
	f[l][0]=l;
	f[l][1]=zx;
	for(int i=2;i<=log2(cen[l]);i++){
		f[l][i]=f[f[l][i-1]][i-1];
	}
	flag[l]=1;
	for(int i=0;i<a[l].size();i++){
		if(flag[a[l][i]]==0){
			unit(a[l][i],l);
		}
	}
}
void lca(int x1,int x2){
	if(cen[x1]>cen[x2]){
		swap(x1,x2);
	}
	int d=1;
	while(cen[x2]>cen[x1]){
		while(cen[x2]-d+1>=1&&cen[x2]-d+1>=cen[x1]){
			d*=2;
		}
		d/=2;
		x2=f[x2][int(log2(d))];
	}
	if(x1==x2){
		printf("%d\n",x1);
		return;
	}
	d=1;
	while(d<cen[x1]){
		d*=2;
	}
	int ans=x1,acen=cen[x1];
	while(d>0){
		int fff=0;
		while(d>acen||flag==0||d!=0){
			d/=2;
			if(d>acen||d==0){
				continue;
			}
			int tmp1=f[x1][int(log2(d))],tmp2=f[x2][int(log2(d))];
			if(tmp1!=tmp2){
				fff=1;
				ans=f[ans][int(log2(d))];
				acen=acen-d+1;
			}
		}
	}
	ans=f[ans][1];
	printf("%d\n",ans);
}
int main(){
	scanf("%d%d%d",&n,&m,&r);
	int x,y;
	for(int i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	unit(r,r);
	int x1,x2;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x1,&x2);
		lca(x1,x2);
	}
	return 0;
}
2023/3/25 22:14
加载中...