zoukankan      html  css  js  c++  java
  • 【模板】左偏树

    如题,这是一个模板。。。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cctype>
     6 
     7 inline void read(int & x)
     8 {
     9     x = 0;
    10     int k = 1;
    11     char c = getchar();
    12     while (!isdigit(c))
    13         if (c == '-') c = getchar(), k = -1;
    14         else c = getchar();
    15     while (isdigit(c))
    16         x = (x << 1) + (x << 3) + (c ^ 48),
    17         c = getchar();
    18     x *= k;
    19 }
    20 
    21 const int MAXN = 100010;
    22 int n, m, opt, x, y, tot = 0;
    23 int faz[MAXN], son[MAXN][2], val[MAXN], dis[MAXN];
    24 
    25 inline int Find(int u)
    26 {
    27     while (faz[u]) u = faz[u];
    28     return u;
    29 }
    30 
    31 int Merge(int a, int b)
    32 {
    33     if (!a || !b) { return a + b; }
    34     if (val[a] > val[b] || (val[a] == val[b] && a > b))
    35         std::swap(a, b);
    36     son[a][1] = Merge(son[a][1], b);
    37     faz[son[a][1]] = a;
    38     if (dis[son[a][0]] < dis[son[a][1]]) 
    39         std::swap(son[a][1], son[a][0]); 
    40     dis[a] = dis[son[a][1]] + 1;
    41     return a;
    42 }
    43 
    44 int qa, qb, cc;
    45 
    46 inline void Merge_opt(int aa, int bb)
    47 {
    48     if (val[aa] == -1 || val[bb] == -1) return;
    49     qa = Find(aa), qb = Find(bb);
    50     if (qa == qb) return;
    51     Merge(qa, qb);
    52 }
    53 
    54 signed main()
    55 {
    56     read(n), read(m);
    57     for (int i = 1; i <= n; ++i)
    58         read(val[i]);
    59     for (int i = 1; i <= m; ++i)
    60     {
    61         read(opt), read(x);
    62         if (opt == 1) read(y), Merge_opt(x, y);
    63         else
    64         {
    65             if (val[x] == -1) {puts("-1"); continue;}
    66             y = Find(x);
    67             printf("%d
    ", val[y]);
    68             faz[son[y][0]] = faz[son[y][1]] = 0;
    69             val[y] = -1;
    70             Merge_opt(son[y][0], son[y][1]);
    71         }
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    在C#中子线程如何操作主窗口线程上的控件
    创建数据透视表数据包含合并单元格
    sql,nosql
    Enthought科学计算,数据分析
    程序员常去的14个顶级开发社区
    Windows查看进程taskList,终止进程tskill
    Pandas库之DataFrame
    centos下chm阅读器
    c++回调函数
    __NSAutoreleaseNoPool(): ... utoreleased with no pool in place
  • 原文地址:https://www.cnblogs.com/yanyiming10243247/p/10057795.html
Copyright © 2011-2022 走看看