我交了第一篇题解,过了;
我把题解的dfs函数改为我写的,过了;
我再把题解的LCA函数改为我写的,也过了;
我甚至连add函数都重写了一遍,还是过了;
我最后将我的代码交了,30pt,直接T飞。。。
本人已崩溃。。。
#include <bits/stdc++.h>
constexpr auto MAX_N = 500005;
constexpr auto MAX_LOG = 22;
class Edge
{
public:
int to;
int next;
};
Edge edges[MAX_N * 2];
int heads[MAX_N];
int depths[MAX_N];
int parents[MAX_N][MAX_LOG]; // parents[i][j] 表i的第2^j级父亲
int logs[MAX_LOG];
auto cnt = 0;
void add(int u, int v)
{
edges[++cnt].to = v;
edges[cnt].next = heads[u];
heads[u] = cnt;
}
void dfs(int now, int parent)
{
parents[now][0] = parent;
depths[now] = depths[parent] + 1;
for (auto i = 1; i <= logs[depths[now]]; i++)
{
parents[now][i] = parents[parents[now][i - 1]][i - 1];
}
for (auto i = heads[now]; i; i = edges[i].next)
{
if (edges[i].to != parent)
{
dfs(edges[i].to, now);
}
}
}
int find_lca(int x, int y)
{
if (depths[x] < depths[y])
{
std::swap(x, y);
}
while (depths[x] > depths[y])
{
x = parents[x][logs[depths[x] - depths[y]] - 1];
}
if (x == y)
{
return x;
}
for (auto i = logs[depths[x]] - 1; i >= 0; i--)
{
if (parents[x][i] != parents[y][i])
{
x = parents[x][i];
y = parents[y][i];
}
}
return parents[x][0];
}
int n, m, s, u, v, x, y;
int main()
{
std::ios::sync_with_stdio(false);
std::cin >> n >> m >> s;
for (auto i = 1; i < n; i++)
{
std::cin >> u >> v;
add(u, v);
add(v, u);
}
for (int i = 1; i <= n; ++i)
{
logs[i] = logs[i - 1] + (1 << logs[i - 1] == i);
}
dfs(s, 0);
for (auto i = 1; i <= m; i++)
{
std::cin >> x >> y;
std::cout << find_lca(x, y) << std::endl;
}
return 0;
}