平衡树的入门题目,也可以用Treap来实现,我觉得Treap的核心就是那个rand()了用来保证树不退化成链,同时还是有平衡树的特性。。总体来说我觉得比较好些,而且比较快

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <iostream>
using namespace std;
const int MAXN = 500000;
struct node{int r, v, sz, number;node *ch[2];void rz(){sz = ch[0]->sz + ch[1]->sz + number;}
}Edges[MAXN+10], *ecnt = Edges, Tnull, *nil = &Tnull;
node *newnode(node *lch, node *rch, int v, int r){++ecnt;ecnt->ch[0] = lch;ecnt->ch[1] = rch;ecnt->v = v;ecnt->r = r;return ecnt;
}
node *retu;
int ret;
struct Treap{node *root;Treap(){root = nil; nil->ch[0] = nil->ch[1] = nil;}void rotate(node *&n, bool d){node *a = n->ch[d];n->ch[d] = a->ch[!d]; n->rz();a->ch[!d] = n; a->rz();n = a;}void Insert(node *&rt, int val){if(rt == nil){rt = newnode(nil, nil, val, rand());rt->number = 1;rt->rz();return ;}rt->sz++;if(val == rt->v){rt->number++;}else if(val < rt->v){Insert(rt->ch[0], val);if(rt->ch[0]->r < rt->r)rotate(rt, false);}else if(val > rt->v){Insert(rt->ch[1], val);if(rt->ch[1]->r < rt->r)rotate(rt, true);}}void del(node *&rt, int val){if(rt == nil) return ;rt->sz--;if(rt->v == val){if(rt->number > 1){rt->number--;}else if(rt->ch[0] == nil || rt->ch[1] == nil){if(rt->ch[0]!=nil)rt = rt->ch[0];elsert = rt->ch[1];}else{if(rt->ch[0]->r > rt->ch[1]->r){rotate(rt, false);del(rt->ch[1], val);rt->rz();}else{rotate(rt, true);del(rt->ch[0], val);rt->rz();}}}else if(val < rt->v)del(rt->ch[0], val);elsedel(rt->ch[1], val);}int Rank(node *rt, int val){if(rt == nil) return ret+1;if(rt->v == val)return ret+rt->ch[0]->sz+1;if(val < rt->v)return Rank(rt->ch[0], val);ret += rt->ch[0]->sz+rt->number;return Rank(rt->ch[1], val);}void pre(node *rt, int val){if(rt == nil) return ;else if(rt->v <= val){retu = rt;pre(rt->ch[1], val);}elsepre(rt->ch[0], val);}void bak(node *rt, int val){if(rt == nil) return ;else if(rt->v >= val){retu = rt;bak(rt->ch[0], val);}elsebak(rt->ch[1], val);}int order(node *rt, int rk){if(rt->sz < rk) return 0;if(rk <= rt->ch[0]->sz)return order(rt->ch[0], rk);else if(rk > rt->ch[0]->sz+rt->number)return order(rt->ch[1], rk-rt->ch[0]->sz-rt->number);return rt->v;}
}tp;
int main(){//freopen("data10.in", "r", stdin);int n;scanf("%d", &n);for(int i=0;i<n;i++){int o, x;scanf("%d %d", &o, &x);switch(o){case 1: tp.Insert(tp.root, x); break;case 2: tp.del(tp.root, x); break;case 3: ret = 0; printf("%d\n", tp.Rank(tp.root, x)); break;case 4: printf("%d\n", tp.order(tp.root, x)); break;case 5: retu = nil;tp.pre(tp.root, x-1); printf("%d\n", retu->v); break;case 6: retu = nil;tp.bak(tp.root, x+1); printf("%d\n", retu->v); break;}}return 0;
}

转载于:https://www.cnblogs.com/JeremyGJY/p/5921723.html

【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树相关推荐

  1. BZOJ 3224: Tyvj 1728 普通平衡树【Treap】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数 ...

  2. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  3. Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)

    Treap树堆:一种排序二叉树(中序遍历权值有序) 每个节点有两个关键字:key[]和rand[] 其中key[]满足二叉搜索树性质,rand[]满足堆性质(即Tree+Heap=Treap)即 如果 ...

  4. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 9629  Solved: 4091 [Submit][S ...

  5. bzoj:3224: Tyvj 1728 普通平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  6. bzoj 3224 Tyvj 1728 普通平衡树

    题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输 ...

  7. 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14480  Solved: 6275 Descripti ...

  8. 【BZOJ】3224: Tyvj 1728 普通平衡树

    [题意] 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最 ...

  9. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: 1 #include<cstdio> 2 #include<cstring& ...

最新文章

  1. Eclipse 调试器(引用IT168)
  2. Python3学习笔记-使用list和tuple
  3. (收藏)[Unix] vi基本操作方法
  4. tdd测试驱动开发课程介绍_测试驱动开发的实用介绍
  5. Android学习四、Android中的Adapter
  6. 云原生人物志|华为云CTO张宇昕:云原生已经进入深水区
  7. go语言生成uuid
  8. 初中物理凸透镜成像动态图_中考物理考点知识总复习:探究凸透镜成像规律
  9. 利用netstat查看http为短连接还是长连接?
  10. onlyoffice pdf 乱码
  11. 宏基4752g 开机进度条卡到75%左右,解决办法
  12. 深度学习在图像识别上的应用
  13. 居家也可以减肥?懒人瘦身也能行-987减肥网
  14. rti matlab,dSPACE-RTI知识介绍.pdf
  15. 中国第一代程序员潘爱民的程序人生
  16. 如何使html中的图片居中
  17. 项目管理工具之甘特图
  18. 一文读懂SpringBoot定时任务
  19. python如何求矩阵逆运算_Sympy复矩阵求逆/运算
  20. 明日边缘 Edge of Tomorrow (2014)旋风下载

热门文章

  1. 《小美斗地主》:棋牌手游新商业模式启示录
  2. 8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要(B)人测试?
  3. solaris下同一机器2个实例之间切换
  4. LEETCODE- The First Day (C++)
  5. PAT1098【插入排序+堆排序】
  6. xmanager 使用
  7. [MySql] MySQL的点点滴滴
  8. asp.net操作Excel总结
  9. securecrt使用_使用securecrt提升工作效率的十个技巧
  10. exp oracle 表空间,oracle之EXP导出表空间错误解决