社区讨论

本题卡倍增不?求调!

P3379【模板】最近公共祖先(LCA)参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mhiza2px
此快照首次捕获于
2025/11/03 18:09
4 个月前
此快照最后确认于
2025/11/03 18:09
4 个月前
查看原帖
TLE #11~13不等,求优化:
CPP
#include<bits/stdc++.h>
#define N 500010
using namespace std;
int n,m,a,b,s,lg[N],f[N][23],d[N];
vector <int> q[N];
int lca(int a,int b)
{
	if(d[a] > d[b]) swap(a,b);
	for(int i = 20;i >= 0;i --)//20改成lg[d[b]] AC
	{
		if(d[f[b][i]] >= d[a]) b = f[b][i];
	}
	if(a == b) return a;
	for(int i = 20;i >= 0;i --)//20改成lg[d[b]] AC
	{
		if(f[a][i] == f[b][i]) continue;
		a = f[a][i],b = f[b][i];
	}
	return f[a][0];
}
void dfs(int x,int fa)
{
//	cout << "x : " << x << endl;
	d[x] = d[fa] + 1;
	f[x][0] = fa;
//	cout << fa;
	for(int i = 1;i <= lg[d[x]];i ++)
		f[x][i] = f[f[x][i - 1]][i - 1];
//	cout << endl;
	for(int i = 0;i < q[x].size();i ++)
	{
		if(q[x][i] == fa) continue;
		dfs(q[x][i],x);
	}
	return;
}
int main()
{
    ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> n >> m >> s;
	for(int i = 1;i < n;i ++)
	{
		cin >> a >> b;
		q[a].push_back(b);
		q[b].push_back(a);
	}
	lg[1] = 0;
	for(int i = 2;i <= n;i ++)
		lg[i] = lg[i >> 1] + 1;
	d[0] = -1;
	dfs(s,0);
	for(int i = 1;i <= m;i ++)
	{
		cin >> a >> b;
		cout << lca(a,b) << endl;
	}
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...