树链剖分全MLE求助
查看原帖
树链剖分全MLE求助
1121518
StarsIntoSea楼主2024/8/10 14:13
#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,int dep){
	depth[x]=dep;
	fa[x]=f;
	siz[x]=1;
	int maxson=-1;
	for(auto y:e[x]){
		printf("%d\n",y);
		if(y==f) continue;
		dfs1(y,x,dep+1);
		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==fa[x]) 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(){
	freopen("P3379_1.in","r",stdin);
	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);
//		printf("%d %d %d\n",i,u,v);
	}
	dfs1(s,0,1);
	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 14:13
加载中...