3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 17706  Solved: 7764
[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

Sample Output

106465
84185
492737

HINT

1.n的数据范围:n<=100000

2.每个数的数据范围:[-2e9,2e9]

Source

平衡树

题目上没说,但是此题是权值小的排在前面。。因为这个我调了1h
treap操作
求前驱后继的时候注意开全局变量而不是函数return,因为函数return 不好写

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 100050
using namespace std;
int n,rt,cnt,ans;struct node{int l,r,w,siz,val,rd;}t[N];
void update(int u){t[u].siz=t[t[u].l].siz+t[t[u].r].siz+t[u].w;}
void lturn(int &u){
int tmp=t[u].r;t[u].r=t[tmp].l;t[tmp].l=u;
t[tmp].siz=t[u].siz;update(u);u=tmp;
}
void rturn(int &u){
int tmp=t[u].l;t[u].l=t[tmp].r;t[tmp].r=u;
t[tmp].siz=t[u].siz;update(u);u=tmp;
}
void insert(int &u,int v){
if(!u){
u=++cnt;t[u].w=t[u].siz=1;
t[u].rd=rand();t[u].val=v;
return;
}
t[u].siz++;
if(v==t[u].val){
t[u].w++;
return;
}
if(v>t[u].val){
insert(t[u].r,v);
if(t[u].rd>t[t[u].r].rd)lturn(u);
}
else{
insert(t[u].l,v);
if(t[u].rd>t[t[u].l].rd)rturn(u);
}
}
void del(int &u,int x){
if(!u)return;
if(t[u].val==x){
if(t[u].w>1){
t[u].w--;t[u].siz--;
return;
}
if(t[u].l*t[u].r==0)u=t[u].l+t[u].r;
else if(t[t[u].l].rd<t[t[u].r].rd)rturn(u),del(u,x);
else lturn(u),del(u,x);
}
else if(x>t[u].val)t[u].siz--,del(t[u].r,x);
else t[u].siz--,del(t[u].l,x);
}
int getrank(int u,int v){
if(t[u].val==v)return t[t[u].l].siz+1;
if(t[u].val>v)return getrank(t[u].l,v);
return t[t[u].l].siz+t[u].w+getrank(t[u].r,v);
}
int getval(int u,int x){
int ls=t[t[u].l].siz;ls=max(ls,0);
if(x>ls&&x<=ls+t[u].w)return t[u].val;
if(x<=ls)return getval(t[u].l,x);
return getval(t[u].r,x-ls-t[u].w);
}
void getpre(int u,int x){
if(!u)return;
if(t[u].val<x){
ans=u;
getpre(t[u].r,x);
}
else getpre(t[u].l,x);
}
void getsuf(int u,int x){
if(!u)return;
if(t[u].val>x){
ans=u;
getsuf(t[u].l,x);
}
else getsuf(t[u].r,x);
}
/*
debug
void dfs(int u){
if(!u)return;
printf("%d %d %d %d\n",u,t[u].l,t[u].r,t[u].val);
dfs(t[u].l);
dfs(t[u].r);
}
*/
int main(){
scanf("%d",&n);
int op,x;int m=0;
while(n--){
//debug printf("line:%d \n",++m);
scanf("%d%d",&op,&x);
if(op==1)insert(rt,x);
if(op==2)del(rt,x);
if(op==3)printf("%d\n",getrank(rt,x));
if(op==4)printf("%d\n",getval(rt,x));
if(op==5)ans=0,getpre(rt,x),printf("%d\n",t[ans].val);
if(op==6)ans=0,getsuf(rt,x),printf("%d\n",t[ans].val);
}
return 0;
}

bzoj3224Tyvj 1728 普通平衡树 treap的更多相关文章

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

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

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

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

  3. [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)

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

  4. BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)

    题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  5. [BZOJ3224]Tyvj 1728 普通平衡树

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

  6. [普通平衡树treap]【学习笔记】

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

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

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

  8. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

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

  9. BZOJ 3224: Tyvj 1728 普通平衡树(BST)

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

随机推荐

  1. 【iOS】Swift类的继承、构造方法、析构器等复习

    一.继承与重写, 防止重写 1.1 基类, 不继承任何类. Swift不想OC或者Java中继承自Object类.定义一个类,不继承任何类,该类就是基类. [java] view plaincopy ...

  2. Python 3.* print 出现SyntaxError: invalid syntax

    很简单,不知道为啥,据说是3.0以后的print都改为了print(); 例如 a=1 print a 上边出错 输入 a=1 print(a) 就正确了

  3. 利用java反射读写csv中的数据

      前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序.  1.在使用java反射读取csv文件数据时,先通 ...

  4. 【learning】多项式相关(求逆、开根、除法、取模)

    (首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...

  5. awk sed tr替换换行符为逗号,并合并为一行

    在群里看到的.记录以备用.  sed 帮助命令:http://man.linuxde.net/sed 文件里有如下行,我想将每行的回车符替换为逗号,并将所有行合并到一行,用awk或sed怎么写啊TOP ...

  6. 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令

    最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...

  7. Angular 学习笔记 (路由外传 - RouteReuseStrategy)

    refer : https://github.com/angular/angular/issues/10929 https://stackoverflow.com/questions/41280471 ...

  8. Python入门之PyCharm的快捷键与常用设置和扩展(Mac系统)

    1. 快捷键 2 . PyCharm的常用设置和扩展 ------------------------------------------------------------------------- ...

  9. python 异常 反射

    异常 反射 一.异常处理: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError ...

  10. Linux磁盘分区-rpm-yum

    一.磁盘分区 1.开启Linux系统前添加一块大小为15G的SCSI硬盘 2.开启系统,右击桌面,打开终端 3.为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...