zoukankan      html  css  js  c++  java
  • 【模板】有旋Treap

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

      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 = 101100;
     22 int n, tot = 0, rt = 0;
     23 int cnt[MAXN], siz[MAXN], val[MAXN], rnd[MAXN];
     24 int son[MAXN][2];
     25 
     26 inline int Rand(void)
     27 {
     28     static int seed = 1024;
     29     return seed = (int)seed * 482711LL % 2147483647;
     30 }
     31 
     32 inline void Pushup(int u)
     33 {
     34     siz[u] = siz[son[u][0]] + siz[son[u][1]] + cnt[u];
     35 }
     36 
     37 inline void Rotate(int &u, int ch)
     38 {
     39     int b = son[u][ch ^ 1];
     40     son[u][ch ^ 1] = son[b][ch];
     41     son[b][ch] = u;
     42     Pushup(u), Pushup(u = b);
     43 }
     44 
     45 inline void Insert(int &u, int x)
     46 {
     47     if (!u)
     48     {
     49         u = ++tot;
     50         cnt[u] = siz[u] = 1;
     51         val[u] = x, rnd[u] = Rand();
     52         son[u][0] = son[u][1] = 0;
     53         return;
     54     }
     55     ++siz[u];
     56     if (val[u] == x) { ++cnt[u]; return; }
     57     int ch = val[u] < x; Insert(son[u][ch], x);
     58     if (rnd[u] > rnd[son[u][ch]]) Rotate(u, ch ^ 1);
     59 }
     60 
     61 inline void Delete(int &u, int x)
     62 {
     63     if (!u) return;
     64     if (val[u] == x)
     65     {
     66         if (cnt[u] > 1) { --cnt[u], --siz[u]; return; }
     67         int ch = rnd[son[u][0]] < rnd[son[u][1]];
     68         if (!son[u][0] || !son[u][1]) u = son[u][0] + son[u][1];
     69         else Rotate(u, ch), Delete(u, x);
     70     }
     71     else --siz[u], Delete(son[u][val[u] < x], x);
     72 }
     73 
     74 inline int Getrank(int u, int x)
     75 {
     76     if (!u) return 0;
     77     if (val[u] == x) return siz[son[u][0]] + 1;
     78     if (val[u] > x) return Getrank(son[u][0], x);
     79     else return Getrank(son[u][1], x) + siz[son[u][0]] + cnt[u];
     80 }
     81 
     82 inline int Getkth(int k)
     83 {
     84     int u = rt;
     85     while (true)
     86         if (k <= siz[son[u][0]]) u = son[u][0];
     87         else if (k > siz[son[u][0]] + cnt[u]) 
     88             k -= siz[son[u][0]] + cnt[u], u = son[u][1];
     89         else return val[u];
     90 }
     91 
     92 inline int Pre(int x)
     93 {
     94     int u = rt, pre = -2147483600;
     95     while (u)
     96         if (x > val[u]) pre = val[u], u = son[u][1];
     97         else u = son[u][0];
     98     return pre;
     99 }
    100 
    101 inline int Suf(int x)
    102 {
    103     int u = rt, suf = 2147483600;
    104     while (u)
    105         if (x < val[u]) suf = val[u], u = son[u][0];
    106         else u = son[u][1];
    107     return suf;
    108 }
    109 
    110 int opt, x;
    111 
    112 signed main()
    113 {
    114     read(n);
    115     for (int i = 1; i <= n; ++i)
    116     {
    117         read(opt), read(x);
    118         if (opt == 1) Insert(rt, x);
    119         if (opt == 2) Delete(rt, x);
    120         if (opt == 3) printf("%d
    ", Getrank(rt, x));
    121         if (opt == 4) printf("%d
    ", Getkth(x));
    122         if (opt == 5) printf("%d
    ", Pre(x));
    123         if (opt == 6) printf("%d
    ", Suf(x));
    124     }
    125     return 0;
    126 }
  • 相关阅读:
    原型模板分享——国外高阶版“大众点评”TripAdvisor
    插画手绘入门教程
    十大用户体验设计失败案例,你知道吗?
    用摹客,轻松管理设计规范!
    摹客“独门绝技”之评论审阅篇
    政务管理系统原型模板分享
    产品经理如何做需求分析?
    python基础知socket编程
    异常处理
    元类,__call__方法和单例模式
  • 原文地址:https://www.cnblogs.com/yanyiming10243247/p/10057788.html
Copyright © 2011-2022 走看看