0分求助
查看原帖
0分求助
303673
waadwdwqdqwd楼主2021/5/23 10:14

代码全tle 但是给的数据却能过? 咋回事???

#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
struct Node {
	int to, nex;
}edge[maxn << 1];
int head[maxn], cnt;
void add(int l, int r) {
	edge[++cnt].nex = head[l];
	edge[head[l] = cnt].to = r;
}
ll len[maxn], d[maxn];
int n, m;
int dep[maxn];
int f[maxn][20];
int dfs_lca(int fa, int x) {
	dep[x] = dep[fa] + 1;
	f[x][0] = fa;
	for (int j = 1; (1 << j) <= dep[x]; ++j) {
		f[x][j] = f[f[x][j - 1]][j - 1]; 
	}
	for (int i = head[x]; i; i = edge[i].nex) {
		int to = edge[i].to;
		if (to == fa) continue;
		dfs_lca(x, to);
	}
}
int LCA(int x, int y) {
	if (dep[x] < dep[y]) swap(x, y);
	for (int i = log2(dep[x]) + 1; i >= 0; --i) {
		if (dep[f[x][i]] >= dep[y]) x = f[x][i];
	}
	if (x == y) return x;
	for (int i = log2(dep[x]) + 1; i >= 0; --i) {
		if (f[x][i] != f[y][i]) {
			x = f[x][i];
			y = f[y][i];
		} 
	}
	return f[x][0]; 	
}
int main() {
	cin >> n >> m;
	int s; cin >> s;
	for (int i = 1, l, r; i < n; ++i) {
		scanf("%d%d", &l, &r);
		add(l, r);
		add(r, l);
	}
	dfs_lca(s, s);
	while (m--) {
		int l, r;
		scanf("%d%d", &l, &r);
		printf("%d\n", LCA(l, r));
	}
	
	return 0;
}
2021/5/23 10:14
加载中...