树链剖分全MLE求助
  • 板块灌水区
  • 楼主StarsIntoSea
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/10 13:45
  • 上次更新2024/8/10 13:48:23
查看原帖
树链剖分全MLE求助
1121518
StarsIntoSea楼主2024/8/10 13:45
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int N=500005;
vector<int> e[N];
int fa[N],son[N],siz[N],depth[N];
int tops[N],dfn[N],tot=0;
int n,m,s;
void dfs1(int x,int f){
	depth[x]=depth[f]+1;
	fa[x]=f;
	siz[x]=1;
	int maxson=-1;
	for(auto y:e[x]){
		if(y==f) continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>maxson) maxson=siz[y],son[x]=y;
	}
}
void dfs2(int x,int top){
	dfn[x]=++tot;
	tops[x]=top;
	if(!son[x]) return ;
	dfs2(son[x],top);
	for(auto y:e[x]){
		if(y==son[x]||y==top) continue;
		dfs2(y,y);
	}
}
int LCA(int x,int y){
	while(tops[x]!=tops[y]){
		if(depth[tops[x]]<depth[tops[y]]) swap(x,y);
		x=fa[tops[x]];
	}
	return depth[x]<=depth[y]?x:y;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<n;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(s,0);dfs2(s,s);
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
//		if(a==b){printf("%d\n",a);continue;}
		printf("%d\n",LCA(a,b));
	}
}
2024/8/10 13:45
加载中...