刚学平衡树,分别用了Splay和fhq-treap交了一遍。
这是Splay的板子,貌似比较短?

Splay

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100005, INF = 2e9;int n;
int nid, root;
int fa[N], ch[N][2];
int val[N];
int sz[N], rep[N];void update(int x) {sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+rep[x];
}void rotate(int x) {int y = fa[x], z = fa[y];int d = ch[fa[x]][1]==x;ch[z][ch[fa[y]][1]==y] = x; fa[x] = z;ch[y][d] = ch[x][d^1]; fa[ch[x][d^1]] = y;ch[x][d^1] = y; fa[y] = x;update(y); update(x);
}void splay(int x, int goal) {for(; fa[x] != goal; rotate(x)) if(fa[fa[x]] != goal)(ch[fa[x]][0]==x)^(ch[fa[fa[x]]][0]==fa[x]) ? rotate(x) : rotate(fa[x]);if(!goal) root = x;
}void find(int v) {int u = root;if(!u) return ;while(ch[u][val[u]<v] && val[u] != v) u = ch[u][val[u]<v];splay(u, 0);
}int findPre(int v) {find(v);int u = root;if(val[u] < v) return u;u = ch[u][0];while(ch[u][1]) u = ch[u][1];return u;
}int findNxt(int v) {find(v);int u = root;if(val[u] > v) return u;u = ch[u][1];while(ch[u][0]) u = ch[u][0];return u;
}void insert(int v) {int u = root, f = 0;while(u && val[u] != v) f = u, u = ch[u][val[u]<v];if(u) rep[u]++;else {nid++;fa[nid] = f;ch[f][val[f]<v] = nid;val[nid] = v;sz[nid] = rep[nid] = 1;u = nid;}splay(u, 0);
}void del(int v) {int pre = findPre(v), nxt = findNxt(v);splay(pre, 0); splay(nxt, pre);int tar = ch[nxt][0];if(rep[tar] > 1) {rep[tar]--;splay(tar, 0);}else ch[nxt][0] = 0;
}int kth(int x) {if(sz[root] < x) return 0;int u = root;while(1) {int lson = ch[u][0];if(x <= sz[lson]) u = lson;else if(x > sz[lson]+rep[u]) x -= sz[lson]+rep[u], u = ch[u][1];else return val[u];}
}int main() {insert(-(1<<31)+2); //添加两个哨兵节点,防止越界insert((1<<31)-2);ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin >> n;for(int i = 1, c, x; i <= n; i++) {cin >> c >> x;if(c == 1) insert(x);else if(c == 2) del(x);else if(c == 3) find(x), cout << sz[ch[root][0]] << endl;else if(c == 4) cout << kth(x+1) << endl;else if(c == 5) cout << val[findPre(x)] << endl;else if(c == 6) cout << val[findNxt(x)] << endl;}return 0;
}

这是fhq-treap的板子(为了美观,我已经不能再无脑压行了)

fhq-treap

#include <iostream>
#include <cstring>
#include <algorithm>
#include <ctime>using namespace std;const int N = 100005;int n;
int ch[N][2], val[N], sz[N], rnd[N];
int nid, root;void update(int x) {sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+1;
}int merge(int x, int y) {if(!x || !y) return x+y;if(rnd[x] < rnd[y]) {ch[x][1] = merge(ch[x][1], y);update(x);return x;} else {ch[y][0] = merge(x, ch[y][0]);update(y);return y;}
}void split(int cur, int k, int &x, int &y) {if(!cur) x = y = 0;else {if(val[cur] <= k) x = cur, split(ch[cur][1], k, ch[cur][1], y);else y = cur, split(ch[cur][0], k, x, ch[cur][0]);update(cur);}
}int newNode(int v) {val[++nid] = v;sz[nid] = 1;rnd[nid] = rand();return nid;
}void insert(int v) {int x, y;split(root, v, x, y);root = merge(merge(x, newNode(v)), y);
}void del(int v) {int x, y, z;split(root, v, x, z); split(x, v-1, x, y);y = merge(ch[y][0], ch[y][1]);root = merge(merge(x, y), z);
}int rankOf(int v) {int x, y, ret;split(root, v-1, x, y);ret = sz[x]+1;root = merge(x, y);return ret;
}int kth(int src, int x) {if(sz[src] < x) return 0;int u = src;while (1) {if(x <= sz[ch[u][0]]) u = ch[u][0];else if(sz[ch[u][0]]+1 == x) return u;else if(sz[ch[u][0]]+1 < x) x -= sz[ch[u][0]]+1, u = ch[u][1];}
}int precursor(int v) { //前驱int x, y, ret;split(root, v-1, x, y);ret = val[kth(x, sz[x])];root = merge(x, y);return ret;
}int successor(int v) { //后继int x, y, ret;split(root, v, x, y);ret = val[kth(y, 1)];root = merge(x, y);return ret;
}int main() {srand((unsigned)time(NULL));ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for(int i = 1, c, x; i <= n; i++) {cin >> c >> x;if(c == 1) insert(x);else if(c == 2) del(x);else if(c == 3) cout << rankOf(x) << endl;else if(c == 4) cout << val[kth(root, x)] << endl;else if(c == 5) cout << precursor(x) << endl;else if(c == 6) cout << successor(x) << endl;}return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/9340015.html

洛谷P3369 普通平衡树相关推荐

  1. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  2. 洛谷 P3391 文艺平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...

  3. 浅尝无旋Treap (基于洛谷P3391 文艺平衡树)

    说是浅尝吧,确实也挺浅的,完全是基于下面这道题写的↓ 洛谷P3391 自己去看题,我是懒得粘了... 分析 其实也没有什么好分析的,这就是一道Splay树的模板题,解决一般的Treap不能解决的区间维 ...

  4. 洛谷P3391文艺平衡树(Splay)

    题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...

  5. 【洛谷P3369】 (模板)普通平衡树

    https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...

  6. 【洛谷P3369】普通平衡树(splay)

    emmmmm直接丢代码了 #include<iostream> #include<cstdio> #include<cstring> #include<str ...

  7. 洛谷P3369 【模板】普通平衡树(STL做法:vectormultiset)

    problem solution1 - AC vector可以AC.lower_bound找第一个大于等于x的,upper_bound找第一个大于x的. #include<bits/stdc++ ...

  8. [洛谷P3391]文艺平衡树

    题目 传送门 to luogu 思路 题外话:一开始用Splay\text{Splay}Splay写了一发,结果-- 然后就换成了Treap\text{Treap}Treap.嗯,无旋Treap\te ...

  9. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

最新文章

  1. EOS技术及生态系统介绍
  2. 网站推广期间如何理解定制网站推广基本要素
  3. html返回滚动按钮,如何通过滚动显示按钮返回TOP
  4. 总共4行代码使用fastxml.json实现Java对象的序列化和反序列化
  5. winsok编程历程
  6. 企业到底需要什么样的飞鸽传书
  7. UE4 控制台管理器: 在C++中设置控制台变量
  8. allow control allow origin_Origin绘图笔记(一)——如何高效绘制一个漂亮的数据图...
  9. python对数组的操作_Python Numpy库对数组的操作详解,
  10. jdbc连接池的数量设置怎么才合适?
  11. 知网回应学者侵权投诉:在研究整改方案,不是一两天能解决,每天忙到零点
  12. Mac下载安装vscode
  13. 马斯克推荐的「50种认知偏差」,这是我见过的最爆笑的解读!
  14. 演示笔记本重装系统win10教程,笔记本电脑安装win10系统
  15. 最近瞎忙,比较懒撒,所以要收收心,该学习的学习。
  16. 什么是聚合路由器、聚合路由器有什么用
  17. 中国民生银行天眼日志平台架构演进的平凡之路
  18. 分享 40 个免费的前端初学者视频教程
  19. ubuntu18.04上使用7z分卷压缩和解压
  20. Simulink 环境基础知识(二十六)--信号基础知识

热门文章

  1. 包装类型与基本类型的装箱与拆箱操作
  2. 用户zabbix@localhost的访问被拒绝(使用密码:yes)_Coinbase意外地保存了3420个客户的未加密密码...
  3. centos选择什么版本_有几千个 Dubbo 实例的瓜子二手车,为什么要选择2.7.3版本?...
  4. java 新建 api 案列_Java利用webservice创建接口案例源码
  5. 局部遮荫光伏matlab,一种基于随机蛙跳全局搜索算法的局部阴影光伏阵列MPPT控制的制作方法...
  6. Altium Designer20 PCB板子绘制
  7. 为什么自己编写的页面总是在那里抖动_别克威朗为什么销量不佳?
  8. java script的trim_Javascript中实现trim()函数的两种方法
  9. Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解
  10. 和preload_通过LD_PRELOAD绕过disable_functions