求后一个程序慢在哪(lca)
  • 板块学术版
  • 楼主shyyds123
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/7/15 09:49
  • 上次更新2023/10/27 20:16:39
查看原帖
求后一个程序慢在哪(lca)
691482
shyyds123楼主2022/7/15 09:49
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct zzz {
    int t, nex;
}e[500010 << 1]; int head[500010], tot;
void add(int x, int y) {
	e[++tot].t = y;
	e[tot].nex = head[x];
	head[x] = tot;
}
int depth[500001], fa[500001][22], lg[500001];
void dfs(int now, int fath) {
	fa[now][0] = fath; depth[now] = depth[fath] + 1;
	for(int i = 1; i <= lg[depth[now]]; ++i)
		fa[now][i] = fa[fa[now][i-1]][i-1];
	for(int i = head[now]; i; i = e[i].nex)
		if(e[i].t != fath) dfs(e[i].t, now);
}
int LCA(int x, int y) {
	if(depth[x] < depth[y]) swap(x, y);
	while(depth[x] > depth[y])
		x = fa[x][lg[depth[x]-depth[y]] - 1];
	if(x == y) return x;
	for(int k = lg[depth[x]] - 1; k >= 0; --k)
		if(fa[x][k] != fa[y][k])
			x = fa[x][k], y = fa[y][k];
	return fa[x][0];
}
int main() {
	int n, m, s; scanf("%d%d%d", &n, &m, &s);
	for(int i = 1; i <= n-1; ++i) {
		int x, y; scanf("%d%d", &x, &y);
		add(x, y); add(y, x);
	}
	for(int i = 1; i <= n; ++i)
		lg[i] = lg[i-1] + (1 << lg[i-1] == i);
	dfs(s, 0);
	for(int i = 1; i <= m; ++i) {
		int x, y; scanf("%d%d",&x, &y);
		printf("%d\n", LCA(x, y));
	}
	return 0;
}
///////////////////////////////////////
#include<bits/stdc++.h>
#define ll  long long
using namespace std;
const ll most=500002;
ll n,m,num=0,f[most][20],head[most],deep[most];
struct eg
{
	ll to,from;
}eg[most<<1];

void ad(ll x,ll y)
{
	eg[++num].to=y;
	eg[num].from=head[x];
	head[x]=num;
}
void dfr(ll x)//预处理 
{
	for(ll i=1;i<=20;i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for(ll i=head[x];i;i=eg[i].from)
	 {
	 	ll v=eg[i].to;
	 	if(v!=f[x][0])
	 	{
	 		deep[v]+=deep[x]+1;
	 		f[v][0]=x;
	 		dfr(v);
		 }
	 }
}
ll lca(ll x,ll y)
{
	if(deep[x]<deep[y])
	swap(x,y);
	for(ll i=20;i>=0;i--)
		if(deep[f[x][i]]>=deep[y])
		 x=f[x][i];
	if(x==y)
	 return x;
	else
	for(ll i=20;i>=0;i--)
	 	if(f[x][i]!=f[y][i])
	 	 {
	 	 	x=f[x][i];
	 	 	y=f[y][i];
		  }
	 return f[x][0];
}
int main()
{
	ll n,m,c,x,y;
	cin>>n>>m>>c;
	for(ll i=1;i<n;i++)
	{
        scanf("%ld%ld",&x,&y);
		ad(x,y);
		ad(y,x);
	}
	deep[c]=1;
	dfr(c);
	for(ll i=1;i<=m;i++)
	{
        scanf("%ld%ld",&x,&y);
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2022/7/15 09:49
加载中...