社区讨论
TLE求助
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo964ve0
- 此快照首次捕获于
- 2023/10/28 06:12 2 年前
- 此快照最后确认于
- 2023/10/28 06:12 2 年前
rt,自己写了个lca结果TLE了,于是照着第一个题解改了下,还是TLE
CPP#include <bits/stdc++.h>
#define MAXN 500005
#define INF 2147483647
using namespace std;
int n, m, s;
int dis[MAXN][22], dep[MAXN], lg[MAXN];
struct EDGE {
int to, next;
}edge[MAXN<<1];
int head[MAXN], cnt;
void insertedge(int u, int v) {
cnt++;
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
int dfs(int u, int fa) {
dis[u][0] = fa;
dep[u] = dep[fa]+1;
for(int i = 1; i <= lg[dep[u]]; i++)
dis[u][i] = dis[dis[u][i-1]][i-1];
for(int i = head[u]; i; i = edge[i].next)
if(edge[i].to != fa)
dfs(edge[i].to, u);
}
int lca(int x, int y) {
if(dep[x] < dep[y])
swap(x, y);
while(dep[x] > dep[y])
x = dis[x][lg[dep[x]-dep[y]]-1];
if(x == y)
return x;
for(int k = lg[dep[x]]-1; k >= 0; k--)
if(dis[x][k] != dis[y][k])
x = dis[x][k], y = dis[y][k];
return dis[x][0];
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m >> s;
for(int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
insertedge(u, v);
insertedge(v, u);
}
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 a, b;
cin >> a >> b;
cout << lca(a, b) << "\n";
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...