3224: Tyvj 1728 普通平衡树
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
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
84185
492737
HINT
#include<cstdio>
#include<cstdlib>
using namespace std;
struct tree{
int l,r,sum,s,num,rnd;
}tr[];
int cnt,t1,t2,n,opt,x,root;
void updata(int k){
int l=tr[k].l,r=tr[k].r;
tr[k].s=tr[l].s+tr[r].s+tr[k].sum;
} void lturn(int &k){
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].s=tr[k].s;updata(k);k=t;
} void rturn(int &k){
int t=tr[k].l; tr[k].l=tr[t].r;tr[t].r=k;
tr[t].s=tr[k].s;updata(k);k=t;
} void insert(int &k,int x){
if (!k){
cnt++;k=cnt;tr[k].num=x; tr[k].s=; tr[k].rnd=rand();tr[k].sum++;return;
}
tr[k].s++;
if (x<tr[k].num){
insert(tr[k].l,x);
if (tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
else if (x>tr[k].num){
insert(tr[k].r,x);
if (tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}
else if (x==tr[k].num) {
tr[k].sum++;
return;
}
} void del(int &k,int x){
if (k==) return;
if (tr[k].num==x){
if (tr[k].sum>){
tr[k].sum--;tr[k].s--; return;
}
if (tr[k].l*tr[k].r==)k=tr[k].l+tr[k].r;
else if (tr[tr[k].l].rnd<tr[tr[k].r].rnd)
rturn(k),del(k,x);
else lturn(k),del(k,x);
}
else if (x>tr[k].num) tr[k].s--,del(tr[k].r,x);
else tr[k].s--,del(tr[k].l,x);
} int find1(int &k,int x){
if (k==) return ;
if (tr[k].num==x) return tr[tr[k].l].s+;
if (tr[k].num>x) return find1(tr[k].l,x);
if (tr[k].num<x) return tr[tr[k].l].s+tr[k].sum+find1(tr[k].r,x);
} int find2(int &k,int x){
if (k==) return ;
int l=tr[k].l,r=tr[k].r;
if (tr[l].s+<=x&&tr[l].s+tr[k].sum>=x) return tr[k].num;
if (tr[l].s>=x) return find2(l,x);
if (tr[l].s+tr[k].sum<x) return find2(r,x-tr[l].s-tr[k].sum);
} void pre(int &k,int x){
if (k==) return;
if (tr[k].num<x){
t1=k;
pre(tr[k].r,x);
}
else pre(tr[k].l,x);
} void after(int &k,int x){
if (k==) return;
if (tr[k].num>x){
t2=k;
after(tr[k].l,x);
}
else after(tr[k].r,x);
} int main(){
scanf("%d",&n);
while (n--){
scanf("%d%d",&opt,&x);
t1=t2=;
switch(opt){
case :insert(root,x); break;
case :del(root,x); break;
case :printf("%d\n",find1(root,x)); break;//查询x数的排名
case :printf("%d\n",find2(root,x));break;
case :pre(root,x);printf("%d\n",tr[t1].num);break;
case :after(root,x);printf("%d\n",tr[t2].num);break;
} }
}
3224: Tyvj 1728 普通平衡树的更多相关文章
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- 【bzoj】3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 10097 Solved: 4302[Submit][St ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- 3224: Tyvj 1728 普通平衡树(finger tree)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 19122 Solved: 8359[Submit][St ...
- 3224: Tyvj 1728 普通平衡树(新板子)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 17048 Solved: 7429[Submit][St ...
- 【BZOJ】3224: Tyvj 1728 普通平衡树(某不科学的oj)
http://www.lydsy.com/JudgeOnline/problem.php?id=3224 无力吐槽,无力吐槽,无力吐槽....... bzoj竟然不能用time(0)我竟然不造!!re ...
随机推荐
- UILabel 自动换行 和支持换行符
这个主要是 lable对\n换行符号的支持,有的时候我们从网页或者后台拿到的数据需要处理一下: 这里没什么要说的,注意两点,一个是label的numofline属性的值要为0 或者不能为1 这样la ...
- 修改UIBarButtonItem字体大小、颜色等相关属性
在ios中如果想修改UIBarButtonItem里面的内容有很多种方法,常见的就是自定义contentView 但是有时候因为懒不想自定义只想在原来的文字上进行修改 如果只是修改UIBarButt ...
- 关于Java中return和finally谁先执行.
例子一: public class A { public static void main(String[] args) { System.out.print(tt()); } public stat ...
- 【转】Myeclipse8.5 反编译插件 jad 安装
[转]Myeclipse8.5 反编译插件 jad 安装 准备工作 下载jad.exe文件下载window版本:http://varaneckas.com/jad/ 下载jadeclipse插件:ht ...
- InvoiceCancelSendApAction
package nc.ui.pu.m25.action; import java.awt.event.ActionEvent; import nc.bs.framework.common.NCLoca ...
- Flume负载均衡配置
flume负载均衡配置 集群DNS配置如下: hadoop-maser 192.168.177.162 machine-0192.168.177.158 machine-1191.168.177.16 ...
- SQL数据库开发知识总结:提高篇
1.联合结果集 (1) 简单的结果集联合 select FNumber,FName,Fage from T_Employee\ union select FidCardNumber,FName,Fag ...
- HTML——表格table标签,tr或者td
表格定义和用法 <tr> 标签定义 HTML 表格中的行. tr 元素包含一个或多个 th 或 td 元素. HTML 与 XHTML 之间的差异 在 HTML 4.01 中,tr 元素的 ...
- asp.net 中excel 导入数据库
protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(Sy ...
- iOS真机调试之我见
入职20多天,以前一直以为iOS真机调试是多么复杂的事情,但在公司大牛的帮助下:终于理清头绪,由于公司证书已申请,文章中免不了旁征博引. 1.首先,得有苹果开发者账号,如果在公司,公司会提供:不在公 ...