求助最后7个点都re为什么,空间都开到最大了(在线RMQ)
查看原帖
求助最后7个点都re为什么,空间都开到最大了(在线RMQ)
355377
xiaozhuo楼主2023/8/14 19:46
#include<bits/stdc++.h>
using namespace std;
const int N = 500010;
int n, m, s;
int head[N * 2], ne[N * 3], v[N * 3], cnt;
int pos[N * 2], seq[N * 5], d[N * 5], tot, vis[N * 2];
int f[N][30];
void add(int x, int y)
{
	v[++cnt] = y, ne[cnt] = head[x], head[x] = cnt;
}
void dfs(int x, int de)
{
	vis[x] = 1;
	pos[x] = ++tot;
	seq[tot] = x;
	d[tot] = de;
	for(int i = head[x];i;i = ne[i])
	{
		if(vis[v[i]]) continue;
		dfs(v[i], de + 1);
		seq[++tot] = x;
		d[tot] = de;
	}
}
void build()
{
	for(int i = 1;i <= tot;i ++) f[i][0] = i;
	int t = log2(tot);
	for(int j = 1;j <= t;j ++)
		for(int i = 1;i <= tot - (1 << j) + 1;i ++)
			if(d[f[i][j - 1]] < d[f[i + (1 << (j - 1))][j - 1]])
			{
				f[i][j] = f[i][j - 1];
			}
			else f[i][j] = f[i + (1 << (j - 1))][j - 1];
}
int lca(int x, int y)
{
	int l = pos[x], r = pos[y];
	if(l > r) swap(l, r);
	int t = log2(r - l + 1);
	if(d[f[l][t]] < d[f[r - (1 << t) + 1][t]])
	{
		return seq[f[l][t]];
	}
	else return seq[f[r - (1 << t) + 1][t]];
}
int main()
{
	cin >> n >> m >> s;
	int a, b;
	for(int i = 1;i <= n - 1;i ++)
	{
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	dfs(s, 1);
	build();
	while(m --)
	{
		cin >> a >> b;
		cout << lca(a, b) << endl;
	}
	return 0;
}
2023/8/14 19:46
加载中...