#6 MLE求助
查看原帖
#6 MLE求助
711361
yHan234楼主2023/9/24 21:13

rt。 开的都是静态空间,为什么别的点没有mle,只有这个点会mle。

#include <iostream>

namespace tree
{
#define mid ((l + r) >> 1)
#define lson l, mid
#define rson mid + 1, r
const int MAGIC = 2e5 * 45;
struct P
{
    int p, h, ls, rs;
} tr[MAGIC] = {{0, 0, 0, 0}};
int n, sz = 1;
int N(int p, int h, int ls, int rs)
{
    tr[sz] = {p, h, ls, rs};
    return sz++;
}
int set(int o, int x, int p, int h, int l = 1, int r = n)
{
    if (x < l || x > r)
        return o;
    if (l == r)
        return N(p, h, 0, 0);
    return N(-1, -1, set(tr[o].ls, x, p, h, lson), set(tr[o].rs, x, p, h, rson));
}
auto get(int o, int x, int l = 1, int r = n)
{
    if (l == r)
        return std::make_pair(tr[o].p, tr[o].h);
    if (x <= mid)
        return get(tr[o].ls, x, lson);
    else
        return get(tr[o].rs, x, rson);
}
auto root(int o, int x)
{
    auto p = get(o, x);
    while (x != p.first)
    {
        x = p.first;
        p = get(o, x);
    }
    return p;
}
} // namespace tree

int ver[200001];
void Solve()
{
    int N, M;
    std::cin >> N >> M;

    tree::n = N;

    for (int i = 1; i <= N; i++)
    {
        ver[0] = tree::set(ver[0], i, i, 0);
    }

    for (int q = 1; q <= M; q++)
    {
        int opt, a, b, k;
        std::cin >> opt;
        if (opt == 2)
            std::cin >> k;
        else
            std::cin >> a >> b;

        if (opt == 1)
        {
            int o = ver[q - 1];
            auto [ra, ha] = tree::root(o, a);
            auto [rb, hb] = tree::root(o, b);
            if (ha > hb)
            {
                std::swap(ra, rb);
                std::swap(ha, hb);
            }
            o = tree::set(o, ra, rb, -1);
            o = tree::set(o, rb, rb, std::max(ha + 1, hb));
            ver[q] = o;
        }
        else if (opt == 2)
        {
            ver[q] = ver[k];
        }
        else if (opt == 3)
        {
            ver[q] = ver[q - 1];
            std::cout << (tree::root(ver[q], a) == tree::root(ver[q], b)) << '\n';
        }
    }
}

signed main()
{
    std::cin.tie(0)->std::ios::sync_with_stdio(0);
    std::cin.exceptions(std::cin.failbit);

    Solve();
}
2023/9/24 21:13
加载中...