ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Fhq-Treap 模板

2022-08-02 01:02:49  阅读:142  来源: 互联网

标签:cnt int siz void Treap inline Fhq find 模板


namespace Fhq_Treap {

int ch[N][3], siz[N], val[N], cnt, rnd[N];

inline void update(int x);
inline int newnode(int x);
inline int Kth(int now, int k);
inline void split(int now, int k, int &x, int &y);
inline int merge(int A, int B);

inline void insert(int a);
inline void Delete(int a);
inline int find_rank(int a);
inline int find_Kth(int a);
inline int find_pre(int a);
inline int find_nxt(int a);
}


namespace Fhq_Treap {

inline void update(int x) { siz[x] = 1 + siz[ch[x][0]] + siz[ch[x][1]]; }
inline int newnode(int x) {
  val[++cnt] = x; siz[cnt] = 1;
  rnd[cnt] = rand();
  return cnt;
}
inline int Kth(int now, int k) {
  while (1) {
    if (k <= siz[ch[now][0]])now = ch[now][0];
    else if (k == siz[ch[now][0]] + 1)return now;
    else k -= siz[ch[now][0]] + 1, now = ch[now][1];
  }
}
inline void split(int now, int k, int &x, int &y) {
  if (now == 0) {
    x = y = 0;
    return ;
  }
  if (val[now] <= k) {
    x = now; split(ch[now][1], k, ch[now][1], y);
  } else {
    y = now; split(ch[now][0], k, x, ch[now][0]);
  }
  update(now);
}
inline int merge(int A, int B) {
  if (!A || !B)return A + B;
  else if (rnd[A] < rnd[B]) {
    ch[A][1] = merge(ch[A][1], B);
    update(A); return A;
  } else {
    ch[B][0] = merge(A, ch[B][0]);
    update(B); return B;
  }
}

inline void insert(int a) {
  split(root, a, x, y);
  root = merge(merge(x, newnode(a)), y);
}
inline void Delete(int a) {
  split(root, a, x, z);
  split(x, a - 1, x, y);
  y = merge(ch[y][0], ch[y][1]);
  root = merge(merge(x, y), z);
}
inline int find_rank(int a) {
  split(root, a - 1, x, y);
  int ret = siz[x] + 1;
  root = merge(x, y);
  return ret;
}
inline int find_Kth(int a) { return val[Kth(root, a)]; }
inline int find_pre(int a) {
  split(root, a - 1, x, y);
  int ret = val[Kth(x, siz[x])];
  root = merge(x, y);
  return ret;
}
inline int find_nxt(int a) {
  split(root, a, x, y);
  int ret = val[Kth(y, 1)];
  root = merge(x, y);
  return ret;
}
}

标签:cnt,int,siz,void,Treap,inline,Fhq,find,模板
来源: https://www.cnblogs.com/Oier-GGG/p/16542356.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有