• 【模板】左偏树


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

     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 }
  • 相关阅读:
    ArcGIS for window mobile 数据打开
    Linux学习拾遗
    ArcEngine 连接sql server sde
    Server Objects Extension(SOE)开发(三)
    Server Objects Extension(SOE)开发(二)
    C# 调用ArcGIS server admin api
    切片文件发布成切片服务
    Printing tools 自定义模板打印的实现
    ubuntu下安装matlab
    修改ubuntu中的gcc和g++版本
  • 原文地址:https://www.cnblogs.com/yanyiming10243247/p/10057795.html
Copyright © 2020-2023  润新知