和板子一样却T飞了。。。
查看原帖
和板子一样却T飞了。。。
735666
thinkerliu楼主2023/9/28 22:33

我交了第一篇题解,过了;

我把题解的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;
}
2023/9/28 22:33
加载中...