您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入数值x。
  2. 删除数值x(若有多个相同的数,应只删除一个)。
  3. 查询数值x的排名(若有多个相同的数,应输出最小的排名)。
  4. 查询排名为x的数值。
  5. 求数值x的前驱(前驱定义为小于x的最大的数)。
  6. 求数值x的后继(后继定义为大于x的最小的数)。
    注意: 数据保证查询的结果一定存在。
    本题为平衡树基本操作的代码实现
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010, INF = 1e8;int n;
struct Node
{int l, r;int key, val;int cnt, size;
}tr[N];int root, idx;void pushup(int p)
{tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + tr[p].cnt;
}int get_node(int key)
{tr[ ++ idx].key = key;tr[idx].val = rand();tr[idx].cnt = tr[idx].size = 1;return idx;
}void zig(int &p)    // 右旋
{int q = tr[p].l;tr[p].l = tr[q].r, tr[q].r = p, p = q;pushup(tr[p].r), pushup(p);
}void zag(int &p)    // 左旋
{int q = tr[p].r;tr[p].r = tr[q].l, tr[q].l = p, p = q;pushup(tr[p].l), pushup(p);
}void build()
{get_node(-INF), get_node(INF);root = 1, tr[1].r = 2;pushup(root);if (tr[1].val < tr[2].val) zag(root);
}void insert(int &p, int key)
{if (!p) p = get_node(key);else if (tr[p].key == key) tr[p].cnt ++ ;else if (tr[p].key > key){insert(tr[p].l, key);if (tr[tr[p].l].val > tr[p].val) zig(p);}else{insert(tr[p].r, key);if (tr[tr[p].r].val > tr[p].val) zag(p);}pushup(p);
}void remove(int &p, int key)
{if (!p) return;if (tr[p].key == key){if (tr[p].cnt > 1) tr[p].cnt -- ;else if (tr[p].l || tr[p].r){if (!tr[p].r || tr[tr[p].l].val > tr[tr[p].r].val){zig(p);remove(tr[p].r, key);}else{zag(p);remove(tr[p].l, key);}}else p = 0;}else if (tr[p].key > key) remove(tr[p].l, key);else remove(tr[p].r, key);pushup(p);
}int get_rank_by_key(int p, int key)    // 通过数值找排名
{if (!p) return 0;   // 本题中不会发生此情况if (tr[p].key == key) return tr[tr[p].l].size + 1;if (tr[p].key > key) return get_rank_by_key(tr[p].l, key);return tr[tr[p].l].size + tr[p].cnt + get_rank_by_key(tr[p].r, key);
}int get_key_by_rank(int p, int rank)   // 通过排名找数值
{if (!p) return INF;     // 本题中不会发生此情况if (tr[tr[p].l].size >= rank) return get_key_by_rank(tr[p].l, rank);if (tr[tr[p].l].size + tr[p].cnt >= rank) return tr[p].key;return get_key_by_rank(tr[p].r, rank - tr[tr[p].l].size - tr[p].cnt);
}int get_prev(int p, int key)   // 找到严格小于key的最大数
{if (!p) return -INF;if (tr[p].key >= key) return get_prev(tr[p].l, key);return max(tr[p].key, get_prev(tr[p].r, key));
}int get_next(int p, int key)    // 找到严格大于key的最小数
{if (!p) return INF;if (tr[p].key <= key) return get_next(tr[p].r, key);return min(tr[p].key, get_next(tr[p].l, key));
}int main()
{build();scanf("%d", &n);while (n -- ){int opt, x;scanf("%d%d", &opt, &x);if (opt == 1) insert(root, x);else if (opt == 2) remove(root, x);else if (opt == 3) printf("%d\n", get_rank_by_key(root, x) - 1);else if (opt == 4) printf("%d\n", get_key_by_rank(root, x + 1));else if (opt == 5) printf("%d\n", get_prev(root, x));else printf("%d\n", get_next(root, x));}return 0;
}

Vector版偷懒平衡树

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int n,opt,x;
int main()
{v.reserve(100001);scanf("%d",&n);while(n--){scanf("%d%d",&opt,&x);if(opt==1)    v.insert(lower_bound(v.begin(),v.end(),x),x);if(opt==2)    v.erase (lower_bound(v.begin(),v.end(),x));if(opt==3)    printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+1);if(opt==4)    printf("%d\n",v[x-1]);if(opt==5)    printf("%d\n",v[lower_bound(v.begin(),v.end(),x)-v.begin()-1]);if(opt==6)    printf("%d\n",v[upper_bound(v.begin(),v.end(),x)-v.begin()]);}return 0;
}

AcWing 253. 普通平衡树相关推荐

  1. 平衡树-Treap基础内容

    平衡树-Treap 2021年8月6日 什么是平衡树? 平衡树是指任意节点左右子树高度差都小于等于1的二叉树. 平衡树干什么? 平衡树对序列的排序,寻找元素的位置有很方便的操作 算法原理 建树 Tre ...

  2. AcWing提高算法课Level-3 第四章 高级数据结构

    AcWing提高算法课Level-3 第四章 高级数据结构 并查集 AcWing 1250. 格子游戏1167人打卡 AcWing 1252. 搭配购买1064人打卡 AcWing 237. 程序自动 ...

  3. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  4. Jozky 刷题目录

    文章目录 本目录参考OI-Wiki 还未解决专区 算法基础 枚举 模拟 递归&分治 贪心 排序 前缀和&差分 二分 倍增 构造 搜索 DFS && BFS 双向搜索 启 ...

  5. AcWing算法提高课笔记

    目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...

  6. AcWing算法提高课 Level-3 第四章 高级数据结构

    并查集 1250. 格子游戏 并查集解决的是连通性(无向图联通分量)和传递性(家谱关系)问题,并且可以动态的维护.抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以 ...

  7. AcWing-算法提高课【合集】

    算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...

  8. PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)

    文章目录 题目分析 题目链接 题目分析 图片来源:acwing 分析 平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树:然后还要满足平衡树的基本特 ...

  9. AcWing蓝桥杯AB组辅导课10、疑难杂题

    文章目录 前言 例题1:AcWing 1242. 修改数组(并查集) 分析 题解:单链表式并查集 例题2:AcWing 1234. 倍数问题(背包问题+贪心) 分析 题解1:01背包问题,三维解法(贪 ...

最新文章

  1. 平衡二叉树及其应用场景
  2. 【深度学习】Swin Transformer结构和应用分析
  3. 4.6 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)
  4. matlab语言中的assert断言函数
  5. linux x和s 的区别,Hadoop1.x和2.X的HDFS fsimage和edits文件运行机制对比
  6. Linux环境下Python的安装过程
  7. MyBatis框架学习笔记01:初探MyBatis实现简单查询
  8. 《2021国庆出行报告》出炉:全国高速拥堵里程占比同比下降37%
  9. vc++6.0中创建工程时选Win32 Application和Win32 console Application的区别
  10. SAP License:结算金额大于可支配金额问题应对
  11. Arcgis Javascript那些事儿(五)--arcgis server发布自定义比例尺地图
  12. 【NOIP2001】【Luogu1049】装箱问题
  13. php试题多选,php考试题 (选择题).doc
  14. MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)
  15. 培训变成了闹剧,却不想怎么改进
  16. 边缘检测---Roberts算子
  17. 如何请求您的Apple ID帐户数据的副本
  18. 企业微信如何做社群运营?企业微信群运营新玩法(可复用)
  19. 【干货】实例讲解:跨部门沟通和与领导沟通的心得与技巧
  20. Git--Git基本使用

热门文章

  1. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  2. 资料分享 | python机器学习教程分享来袭
  3. 谁的代码注释我都不服,就服你的!
  4. PL/SQL Developer使用技巧总结
  5. python 绘制围棋棋盘_围棋之规则基础(一)
  6. 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!
  7. 陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布
  8. java使用zmodem_SecureCRT 中使用zmodem和Linux服务器交换文件
  9. tcp拥塞控制_网络TCP的拥塞控制算法简介
  10. leetcode剑指 Offer 29. 顺时针打印矩阵