treap,算是模板题了...我中间还一次交错题...

--------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
 
#define rep(i,n) for(int i=0;i<n;++i)
#define clr(x,c) memset(x,c,sizeof(x))
 
using namespace std;
 
const int inf=1e9;
const int maxn=100000+5;
 
struct Node {
Node *ch[2];
int r;
int v;
int s;
Node(int v=0):v(v) {
   ch[0]=ch[1]=NULL;
   r=rand();
   s=1;
}
int cmp(int x) const {
if(x==v) return -1;
return x<v ? 0 : 1;
}
void maintain() {
s=1;
if(ch[0]!=NULL) s+=ch[0]->s;
if(ch[1]!=NULL) s+=ch[1]->s;
}
};
 
void rotate(Node* &o,int d) {
Node* k=o->ch[d^1];
o->ch[d^1]=k->ch[d];
k->ch[d]=o;
o->maintain(); k->maintain();
o=k;
}
 
void insert(Node* &o,int x) {
if(o==NULL) o=new Node(x);
else {
int d=(x<o->v ? 0 : 1);
insert(o->ch[d],x);
if(o->ch[d]->r > o->r) rotate(o,d^1);
}
o->maintain();
}
 
Node* find(Node* o,int x) {
if(o==NULL) return NULL;
if(x==o->v) return o;
return x<o->v ? find(o->ch[0],x) : find(o->ch[1],x);
}
 
void remove(Node* &o,int x) {
int d=o->cmp(x);
if(d==-1) {
Node* k=o;
if(o->ch[0]!=NULL && o->ch[1]!=NULL) {
int d2=(o->ch[0]->r > o->ch[1]->r ? 1 : 0);
rotate(o,d2); remove(o->ch[d2],x);
} else {
if(o->ch[0]==NULL) o=o->ch[1];
else o=o->ch[0];
delete k;
   }
} else remove(o->ch[d],x);
if(o!=NULL) o->maintain();
}
 
int rank(Node* o,int x) {
if(o==NULL) return 1;
if(x<=o->v) return rank(o->ch[0],x);
return rank(o->ch[1],x)+(o->ch[0]==NULL ? 0 : o->ch[0]->s)+1;
}
 
int kth(Node* o,int k) {
if(o==NULL || k<=0 || k>o->s) return 0;
int s=(o->ch[0]==NULL ? 0 : o->ch[0]->s);
if(k==s+1) return o->v;
else if(k<=s) return kth(o->ch[0],k);
    else return kth(o->ch[1],k-s-1);
}
 
int pred(Node* o,int x) {
int ans=-inf;
while(o!=NULL) {
int d=(x>=o->v ? 1 : 0);
if(d) ans=max(ans,o->v);
o=o->ch[d];
}
return ans;
}
 
int succ(Node* o,int x) {
int ans=inf;
while(o!=NULL) {
int d=(x<=o->v ? 0 : 1);
if(!d) ans=min(ans,o->v);
o=o->ch[d];
}
return ans;
}
int main()
{
// freopen("test.in","r",stdin);
Node* root=new Node(inf);
int n,t;
scanf("%d",&n);
while(n--) {
int a,b;
scanf("%d%d",&a,&b);
switch(a) {
case 1 : insert(root,b); break;
case 2 : if(find(root,b)!=NULL) remove(root,b); break;
case 3 : printf("%d\n",rank(root,b)); break;
case 4 : printf("%d\n",kth(root,b)); break;
case 5 : printf("%d\n",pred(root,b-1)); break;
case 6 : printf("%d\n",succ(root,b+1)); break;
default: break;
}
}
return 0;
}

--------------------------------------------------------------------

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 3328  Solved: 1349
[Submit][Status][Discuss]

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

BZOJ 3224: Tyvj 1728 普通平衡树(BST)的更多相关文章

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

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

  2. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

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

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

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

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

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  5. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

  6. BZOJ 3224 Tyvj 1728 普通平衡树模板

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...

  7. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

  8. bzoj 3224/Tyvj 1728 普通平衡树(splay)

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

  9. fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树

    题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...

随机推荐

  1. Linux系统CentOS6.2版本号下安装JDK7具体过程

    前言:        java 是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE( ...

  2. JS实现快排

    /*采用快排的方法排序,取第一个值为轴对数组进行分割排序,不断迭代后实现数组的排序*/ //定义分割函数 function partF(A,low, high){ var temp = A[low]; ...

  3. SQL学习之计算字段的用法与解析

    一.计算字段 1.存储在数据库表中的数据一般不是应用程序所需要的格式.大多数情况下,数据表中的数据都需要进行二次处理.下面举几个例子. (1).我们需要一个字段同时显示公司名和公司地址,但这两个信息存 ...

  4. 二、获取AccessToken

    二.获取AccessToken 1.官方文档: access_token是微信官方公众号调用接口的全局唯一票据,开发者调用任何接口都需要使用access_token,由于access_token有效期 ...

  5. 一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞

    转载自:http://www.blogjava.net/huliqing/archive/2008/04/18/193907.html 对于作Java桌面应用来说,比较烦人的就是安装部署问题,客户端是 ...

  6. WCF---服务发布的步骤

    服务发布的步骤: 1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配 ...

  7. C iOcp

    #include <winsock2.h> //#include <windows.h> #include <stdio.h> #define PORT 5150 ...

  8. C语言与管道

    int main() { int s; int n; float avg; scanf("%d,%d",&s,&n); //特别注意的地方 // scanf(&qu ...

  9. glib源码安装使用方法

    glib库是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事 ...

  10. js静态属性和静态方法

    啥也不说了,直接上代码...(就是这么任性)     var Animal = function(){};     Animal.name = "dog";     var a = ...