[ 模板 ] Treap指针版
来源:互联网 发布:calendar java设置今天 编辑:程序博客网 时间:2024/05/23 11:50
#include <stdio.h>#include <stdlib.h>struct Treap{ Treap *Lson,*Rson; int val,key,cnt,size; Treap(int num) { Lson = Rson = NULL; val = num; key = rand(); cnt = size = 1; } void push_up() { size = cnt; if(Lson) size += Lson->size; if(Rson) size += Rson->size; } friend void zig(Treap *&A)//左旋 { Treap *B = A -> Lson; A -> Lson = B -> Rson; B -> Rson = A; A = B; A->Rson->push_up(); A->push_up(); } friend void zag(Treap *&A)//右旋 { Treap *B = A -> Rson; A -> Rson = B -> Lson; B -> Lson = A; A = B; A->Lson->push_up(); A->push_up(); } friend void insert(Treap *&rt,int num) { if(rt == NULL) { rt = new Treap(num); return ; } else if(num == rt->val) { rt->cnt++; } else if(num < rt->val) { insert(rt->Lson,num); if(rt->Lson->key > rt->key) zig(rt); } else { insert(rt->Rson,num); if(rt->Rson->key > rt->key) zag(rt); } if(rt) rt -> push_up(); } friend void delete_num(Treap *&rt,int num) { if(rt == NULL) return ; else if(num < rt->val) delete_num(rt->Lson,num); else if(num > rt->val) delete_num(rt->Rson,num); else { if(rt->cnt > 1) rt->cnt--; else if(rt->Lson == NULL) rt = rt->Rson; else if(rt->Rson == NULL) rt = rt->Lson; else { if(rt->Lson->key > rt->Rson->key) { zag(rt); delete_num(rt->Lson,num); } else { zig(rt); delete_num(rt->Rson,num); } } } if(rt) rt->push_up(); } friend int search_rank(Treap *rt,int num) { if(rt==NULL) return 0; int Lsize = (rt->Lson ? rt->Lson->size : 0); if(rt->val == num) return Lsize+1; else if(rt->val < num) return Lsize + rt->cnt + search_rank(rt->Rson,num); else return search_rank(rt->Lson,num); } friend int search_num(Treap *rt,int rank) { if(rt == NULL) return 0; int Lsize = (rt->Lson ? rt->Lson->size : 0); if(Lsize >= rank) return search_num(rt->Lson,rank); else if(Lsize+rt->cnt < rank) return search_num(rt->Rson,rank-Lsize-rt->cnt); else return rt->val; } friend void search_pre(Treap *rt,int num,Treap *&p) { if(rt == NULL) return ; else if(rt->val < num) { p = rt; search_pre(rt->Rson,num,p); } else search_pre(rt->Lson,num,p); } friend void search_suc(Treap *rt,int num,Treap *&p) { if(rt == NULL) return ; else if(rt->val > num) { p = rt; search_suc(rt->Lson,num,p); } else search_suc(rt->Rson,num,p); }}*rt,*ans;int n,opt,x;int main(){ srand(20000620); rand(); scanf("%d",&n); while(n--) { scanf("%d%d",&opt,&x); if(opt == 1) insert(rt,x); if(opt == 2) delete_num(rt,x); if(opt == 3) printf("%d\n",search_rank(rt,x)); if(opt == 4) printf("%d\n",search_num(rt,x)); if(opt == 5) { ans = NULL; search_pre(rt,x,ans); printf("%d\n",ans->val); } if(opt == 6) { ans = NULL; search_suc(rt,x,ans); printf("%d\n",ans->val); } } return 0;}
0 0
- [ 模板 ] Treap指针版
- Treap模板(简单版)
- Treap模板(中级版)
- 【Treap】Treap模板
- Treap模板+Treap介绍。。。
- Treap模板
- 【Treap模板】
- (模板)treap
- treap 模板
- Treap模板
- treap 模板
- treap模板
- Treap 模板
- 【模板】Treap
- treap模板
- Treap模板
- Treap 模板
- Treap模板
- HDU rM. Frog’s Problem (打表找规律)
- 学习杂物(一)java学习笔记
- mysql启动报错(kill后)解决记录
- 源码编译安装Ambari
- 布局平分,中间有竖线,如dialog里取消确定
- [ 模板 ] Treap指针版
- 润乾报表超链接中对参数进行加密解密
- Caffe+ubuntu14.04+cuda8.0+opencv249+python27
- 最近对接口有了深一点的理解,以及什么是解耦
- 实验室应急指挥系统上的跟踪小程序
- 逐浪CMS2 x3.8新功能:定时执行C#代码让二次开发虎虎添翼
- QList (链表) & QVector (数组)
- SQL的基于Qt的编程实践---1--数据库
- 工作中常用的第三放的框架