各位大佬,求助求助!!这个RMQ哪里错了呀
查看原帖
各位大佬,求助求助!!这个RMQ哪里错了呀
486001
Knighthood楼主2022/1/1 21:05
#include<bits/stdc++.h>
#define Max 500005
using namespace std;
int N,M,R;
int h[Max],to[Max<<1],nex[Max<<1],did;
int o[Max<<1],dep[Max<<1],cnt,first[Max];
struct node{
	int val,id;
}f[Max<<1][20],g[Max<<1][20];
int Log[Max];
void edge(int a,int b){
	to[++did]=b;
	nex[did]=h[a];
	h[a]=did;
}
void dfs(int u,int fa,int de){
	o[++cnt]=u;
	dep[cnt]=de;
	if(first[u]==0)first[u]=cnt;
	for(int i=h[u];i;i=nex[i]){
		int v=to[i];
		if(v==fa)continue;
		dfs(v,u,de+1);
		o[++cnt]=u;
		dep[cnt]=de;
	}
}
int LCA(int a,int b){
	int x=first[a],y=first[b];
	if(x>y)swap(x,y);
	if(f[a][Log[y-x+1]].val<g[b][Log[y-x+1]].val)
		return o[f[a][Log[y-x+1]].id];
	else return o[g[b][Log[y-x+1]].id];
}
int main(){
	scanf("%d%d%d",&N,&M,&R);
	for(int i=1;i<N;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		edge(a,b);
		edge(b,a);
	}
	dfs(R,0,1);
	for(int i=1;i<=cnt;i++)f[i][0].val=g[i][0].val=dep[i],f[i][0].id=g[i][0].id=i;
	for(int i=cnt-1;i>=1;--i){
		for(int j=1;(1<<j)+i<=cnt;j++){
			if(f[i][j-1].val<f[i+(1<<j)][j-1].val){
				f[i][j]=f[i][j-1];
			}
			else f[i][j]=f[i+(1<<j)][j-1];
		}
	}
	for(int i=2;i<=cnt;i++){
		for(int j=1;(1<<j)<=i;j++){
			if(g[i][j-1].val<g[i-(1<<j-1)][j-1].val)
				g[i][j]=g[i][j-1];
			else g[i][j]=g[i-(1<<j-1)][j-1];
		}
	}
	Log[1]=0;
	for(int i=2;i<=N;i++)Log[i]=Log[i/2]+1;
	while(M--){
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",LCA(a,b));
	}
	return 0;
}
2022/1/1 21:05
加载中...