zoukankan      html  css  js  c++  java
  • 罗马游戏(左偏树)

    左偏树模板题。

    只不过这里要加上并查集的路径压缩(因为要找堆顶),不然复杂度是错的。

    因为一个人被杀了,他就没了,为了证明他没了,所以要把他的val设成-1。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int N = 1000010;
    struct Leftist_Tree{
        int lson, rson, val, dist, fa;
    }t[N];
    int merge(int x, int y) {
        if (!x || !y) return x | y;
        if (t[x].val > t[y].val) {
            swap(x, y);
        }
        t[x].rson = merge(t[x].rson, y);
        if (t[t[x].rson].dist > t[t[x].lson].dist) {
            swap(t[x].lson, t[x].rson);
        }
        t[t[x].lson].fa = t[t[x].rson].fa = t[x].fa = x;
        t[x].dist = t[x].dist + 1;
        return x;
    }
    int get(int x) {
        return t[x].fa == x ? x : t[x].fa = get(t[x].fa);//路径压缩
    }
    void pop(int x) {
        t[x].val = -1;
        t[t[x].lson].fa = t[x].lson;
        t[t[x].rson].fa = t[x].rson;
        t[x].fa = merge(t[x].lson, t[x].rson);
    }
    int n, m, a[N];
    int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            t[i].fa = i;
            t[i].val = a[i];
        }
        scanf("%d", &m);
        while (m--) {
            char opt[5];
            int x, y;
            scanf("%s%d", opt + 1, &x);
            if (opt[1] == 'M') {
                scanf("%d", &y);
                if (t[x].val == -1 || t[y].val == -1) continue;
                if (get(x) == get(y)) continue; 
                t[get(x)].fa = t[get(y)].fa = merge(get(x), get(y));
            } else {
                if (t[x].val == -1) puts("0"); 
                else printf("%d
    ", t[get(x)].val), pop(get(x));
            }
        }
        return 0;
    }
  • 相关阅读:
    牛客网-2019校招真题-跳格子游戏(斐波那契数列)
    牛客网-2019校招真题-学数学
    牛客网-2019校招真题-方格走法
    牛客网-2019年校招真题-通过率降序(二)
    牛客网-2019年校招真题-通过率降序(一)
    常用数据库连接URL的举例
    Css3-渐变
    清除浮动的方法
    html中的条件注释
    Css中的定位
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/12863564.html
Copyright © 2011-2022 走看看