• 左偏树


    左偏树

    一开始有 \(n\) 个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:

    1. 1 x y:将第 \(x\) 个数和第 \(y\) 个数所在的小根堆合并(若第 \(x\) 或第 \(y\) 个数已经被删除或第 \(x\) 和第 \(y\) 个数在用一个堆内,则无视此操作)。
    2. 2 x:输出第 \(x\) 个数所在的堆最小数,并将这个最小数删除(若有多个最小数,优先删除先输入的;若第 \(x\) 个数已经被删除,则输出 \(-1\) 并无视删除操作)。

    第一行包含两个正整数 \(n,m\),分别表示一开始小根堆的个数和接下来操作的个数。

    第二行包含 \(n\) 个正整数,其中第 \(i\) 个正整数表示第 \(i\) 个小根堆初始时包含且仅包含的数。

    接下来 \(m\) 行每行 \(2\) 个或 \(3\) 个正整数,表示一条操作。

    输出包含若干行整数,分别依次对应每一个操作 \(2\) 所得的结果。

    #define M 150010
    #define swap my_swap
    #define ls S[x].Son[0]
    #define rs S[x].Son[1]
    
    struct Tree
    {
        ll dis, val, Son[2], rt;
    } S[M];
    ll N, T, A, B, C, i;
    
    inline ll Merge(ll x, ll y);
    ll my_swap(ll &x, ll &y) { x ^= y ^= x ^= y; }
    inline ll Get(ll x) { return S[x].rt == x ? x : S[x].rt = Get(S[x].rt); }
    inline void Pop(ll x) { S[x].val = -1, S[ls].rt = ls, S[rs].rt = rs, S[x].rt = Merge(ls, rs); }
    inline ll Merge(ll x, ll y)
    {
        if (!x || !y)
            return x + y;
        if (S[x].val > S[y].val || (S[x].val == S[y].val && x > y))
            swap(x, y);
        rs = Merge(rs, y);
        if (S[ls].dis < S[rs].dis)
            swap(ls, rs);
        S[ls].rt = S[rs].rt = S[x].rt = x, S[x].dis = S[rs].dis + 1;
        return x;
    }
    int main()
    {
        N = read(), T = read();
        S[0].dis = -1;
        for (i = 1; i <= N; ++i)
            S[i].rt = i, S[i].val = read();
        for (i = 1; i <= T; ++i)
        {
            A = read(), B = read();
            if (A == 1)
            {
                C = read();
                if (S[B].val == -1 || S[C].val == -1)
                    continue;
                ll f1 = Get(B), f2 = Get(C);
                if (f1 != f2)
                    S[f1].rt = S[f2].rt = Merge(f1, f2);
            }
            else
            {
                if (S[B].val == -1)
                    puts("-1");
                else
                    printf("%lld\n", S[Get(B)].val), Pop(Get(B));
            }
        }
        return 0;
    }
    
  • 相关阅读:
    TortoiseGit 的下载与安装
    CountDownLatch在多线程程序中的应用
    IDEA中maven的依赖jar包报红
    监控中的TP50
    BeanUtils.copyProperties方法,当属性Date为null解决
    SimpleDateFormat的安全问题解决方法
    java修饰符用法
    java实现快速排序
    京东2016实习生编程题—生日礼物
    美图笔试算法题(两个人拿石头判断输赢)
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/14948602.html
Copyright © 2020-2023  润新知