【bzoj】3224: Tyvj 1728 普通平衡树

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 10097  Solved: 4302
[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.每个数的数据范围:[-1e7,1e7]

数据如下http://pan.baidu.com/s/1jHMJwO2

一万年没写数据结构了,来发treap模板练练手/
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 using namespace std;
  9 #define maxn 110010
 10 #define llg  int
 11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 12 int n,m,ans;
 13 
 14 inline int getint()
 15 {
 16        int w=0,q=0;
 17        char c=getchar();
 18        while((c<'0' || c>'9') && c!='-') c=getchar();
 19        if (c=='-')  q=1, c=getchar();
 20        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
 21        return q ? -w : w;
 22 }
 23 
 24 struct MYTREAP
 25 {
 26     int root,size;
 27     struct 
 28     {
 29         int l,r,rnd,val,w,size;
 30     }po[maxn];
 31     
 32     void init(){ memset(po,0,sizeof(po)); root=size=0;}
 33     
 34     void update(llg now) {po[now].size=po[po[now].l].size+po[po[now].r].size+po[now].w;}
 35         
 36     void right_(llg &now) {llg t=po[now].l; po[now].l=po[t].r; po[t].r=now; po[t].size=po[now].size; update(now); now=t;}
 37     void left_(llg &now)  {llg t=po[now].r; po[now].r=po[t].l; po[t].l=now; po[t].size=po[now].size; update(now); now=t;}
 38 
 39     void in(llg val)
 40     {
 41         insert(root,val);
 42     }
 43 
 44     void insert(llg &now,llg val)
 45     {
 46         if (now==0)
 47         {
 48             now=++size;
 49             po[now].size=po[now].w=1; po[now].val=val; po[now].rnd=rand();
 50             return ;
 51         }
 52         po[now].size++;
 53         if (po[now].val==val)
 54         {
 55             po[now].w++;
 56         }
 57         else
 58             if (po[now].val<val)
 59             {
 60                 insert(po[now].r,val);
 61                 if (po[po[now].r].rnd<po[now].rnd) left_(now);
 62             }
 63             else
 64             {
 65                 insert(po[now].l,val);
 66                 if (po[po[now].l].rnd<po[now].rnd) right_(now);
 67             }
 68     }
 69     
 70     void del(llg &now,llg val)
 71     {
 72         if (now==0) return ;
 73         if (po[now].val==val)
 74         {
 75             if (po[now].w>1)
 76             {
 77                 po[now].w--; po[now].size--;
 78                 return ;
 79             }
 80             if (po[now].l*po[now].r==0) now=po[now].l+po[now].r;
 81             else
 82             {
 83                 if (po[po[now].l].rnd<po[po[now].r].rnd) right_(now); else left_(now);
 84                 del(now,val);
 85             }
 86         }
 87         else
 88         {
 89             po[now].size--;
 90             if (val>po[now].val) del(po[now].r,val);
 91             else del(po[now].l,val);
 92         }
 93     }
 94 
 95     int ask_rank(llg now,llg val)
 96     {
 97         if (now==0) return 0;
 98         if (po[now].val==val) return po[po[now].l].size+1;
 99         else
100             if (val>po[now].val) return po[po[now].l].size+po[now].w+ask_rank(po[now].r,val);
101             else return ask_rank(po[now].l,val);
102     }
103 
104     int ask_num(llg now,int val)
105     {
106         if (now==0) return 0;
107         if (val<=po[po[now].l].size) 
108             return ask_num(po[now].l,val);
109         else if (val>po[po[now].l].size+po[now].w) 
110             return ask_num(po[now].r,val-po[po[now].l].size-po[now].w);
111         else 
112             return po[now].val; 
113     }
114 
115     void pre(llg now,llg val)
116     {
117         if (now==0) return ;
118         if (po[now].val<val)
119         {
120             ans=now; 
121             pre(po[now].r,val);
122         }
123         else pre(po[now].l,val);
124     }
125 
126     void nex(llg now,llg val)
127     {
128         if (now==0) return ;
129         if (po[now].val>val)
130         {
131             ans=now;
132             nex(po[now].l,val);
133         }
134         else nex(po[now].r,val);
135     }
136 
137 }tree;
138 
139 int main()
140 {
141     yyj("3224");
142     srand(1346);
143     tree.init();
144     cin>>n;
145     llg ty,x;
146     for (llg i=1;i<=n;i++)
147     {
148         ty=getint(),x=getint();
149         switch(ty)
150         {
151             case 1:tree.in(x);break;
152             case 2:tree.del(tree.root,x);break;
153             case 3:printf("%d\n",tree.ask_rank(tree.root,x));break;
154             case 4:printf("%d\n",tree.ask_num(tree.root,x));break;
155             case 5:ans=0;tree.pre(tree.root,x);printf("%d\n",tree.po[ans].val);break;
156             case 6:ans=0;tree.nex(tree.root,x);printf("%d\n",tree.po[ans].val);break;
157         }
158     }
159     return 0;
160 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6291297.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 修改 referer_看好你的门-客户端传数据-用java修改referer

1、简单说明Referer、origin用来表明&#xff0c;浏览器向WEB服务器表明自己来自哪里。但是就它本身而言&#xff0c;并非完全安全。写一个例子&#xff0c;可以任意修改http信息头中的referer、origin2、准备&#xff1a;用httpClient4.0来具体实现3、Java修改http信息头refer…

table 样式详解

1.table 中css样式控制border 只能控制外边框&#xff0c;内边框需要写<table border"1"> 2.table 会自动撑大&#xff0c;即使td 设置了 width和height这与div 是不同的 3.只有一个table的时候 &#xff0c;高度自适应全屏 <style type"text/css"…

libsvm java 实例_LibSVM Java API调用示例程序

【实例简介】LibSVM Java API调用示例程序Eclipse 完整工程可以运行相关详情见http://blog.csdn.net/yangliuy/article/details/8041343#comments3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例欢迎关注我的博客blog.csdn.net/yangliuy【实例截图】【核心代码】326…

关于H3 BPM数据库如何实现排序取数据的问题

问题&#xff1a; 在打印模板中获取子表内容&#xff0c;可从数据库中取数据&#xff0c;而当前项目数据库里面数据按年度录入&#xff0c;但是只需要显示近3年的数据&#xff0c;插件如何实现排序取数据&#xff1f; 解决方法&#xff1a; 1、先直接写一个SQL语句&#xff0c;…

java 将pdf转换成word_java如何实现pdf转word?

Atitit pdf转文本 pdfutiljava -jar C:\Users\attilax\Pictures\pdfbox-app-2.0.9.jar ExtractText "C:\atibeks517\l4 doc v3 r7a ori exted\_0index\一种简单的基于字符形状的验证码识别技术.pdf" c:\logs\识别技术.pdf.txt转html-consolefalseSend text to consol…

spring整合

spring整合hibernate&#xff0c;整合什么&#xff1f; 1. Spring 整合 Hibernate 整合什么 ?1). 有 IOC 容器来管理 Hibernate 的 SessionFactory 2). 让 Hibernate 使用上 Spring 的声明式事务2. 整合步骤:1). 加入 hibernate ①. jar 包 ②. 添加 hibernate 的配置文件: hi…

java 进程不关闭_java运行程序关不了窗口

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package office菜单;import java.awt.Frame;import java.awt.Menu; //菜单组件import java.awt.MenuBar; //菜单条组件import java.awt.MenuItem; //菜单项组件public class frameTest {public static void main(String[] args) {f…

看看大货车到底有多少盲区,肯定用得到!救命的!

上路的司机都知道&#xff0c;一旦看到大货车就要离它远远的&#xff0c;因为大货车的盲区大。可是又有多少轿车司机懂得盲区在哪里呢?不仅是轿车司机&#xff0c;许多行人和非机动车辆对于大货车的盲区也是一知半解&#xff0c;常常有人因此丧命。 行人篇 先给大家看一张最直…

msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象

原文在简书首发&#xff1a;http://www.jianshu.com/p/badf412db4e7lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库&#xff0c;没有任何其它依赖&#xff0c;编译后可以直接被lua调用&#xff0c;目前主要支持Lua5.1/5.2/5.3 版本。1、什么是MessagePack&#xff1f;-…

Oracle-11g 基于 NBU 的 rman 冷备份及恢复

备份恢复环境&#xff1a; (1).源端&#xff1a;SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6&#xff08;RAC&#xff09;(2).目标端&#xff1a;SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6&#xff08;RAC&#xff09;冷备份及恢复情形&#xff1a;冷备份 odsdb 集群…

全国250米DEM数据

全国250米DEM数据 DEM是数字高程模型的英文简称(Digital Elevation Model)&#xff0c;是研究分析地形、流域、地物识别的重要原始资料。由于DEM 数据能够反映一定分辨率的局部地形特征&#xff0c;因此通过DEM 可提取大量的地表形态信息&#xff0c;可用于绘制等高线、坡度图、…

redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解

jedis是一个著名的key-value存储系统&#xff0c;而作为其官方推荐的java版客户端jedis也非常强大和稳定&#xff0c;支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比&#xff1a;一、普通同步方式最简单和基础…

【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp

题目描述 最近&#xff0c;Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是&#xff0c;她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的N(2 < N < 100,000)根电话线杆上&#xff0c; 第i根电话线杆的高度为height_i米(1 &…

Loadrunner进行HTTPS协议性能测试

1.最简单办法就是在脚本前面加上&#xff1a;web_set_sockets_option("SSL_VERSION","TLS")&#xff0c;一般能解决HTTPS协议的请求问题&#xff0c;无毒无公害&#xff0c;快速还能解决问题 2.其实对于HTTP跟HTTPS&#xff0c;只是在服务器端配置到底是走…

Linux 权限、磁盘操作命令-Linux基础环境命令学习笔记

1、创建用户和用户组 1&#xff09;用户和用户组 /etc/passwd  保存系统用户的基本信息 /etc/group    保存用户组信息 用户名&#xff1a;x&#xff1a;UID&#xff1a;GID 2&#xff09;基本命令 useradd  增加用户 groupadd  增加用户组 passwd  为用户设置密码…

java伪代码生成器_JAVA单例模式的实现伪代码

什么是单例&#xff1f;&#xff1a;其定义是单例对象的类只能允许一个实例存在单例的实现基本原理&#xff1a;1.将该类的构造方法定义为私有访问&#xff0c;不对外暴露从而使其他类不能实例化该类对象&#xff0c;只能通过该类的静态方法得到该类的唯一实例 2.在该类中定义一…

python怎么存储数据_Python:如何在类中存储数据并继承

我对课程很陌生,我已经写了一个班来做熊猫的操作。分类方法,但我不知道如何使用它们。我的班级目标:我想写一个权限类。它应该加载/写入一个json文件,并且应该能够添加更多的权限。编辑:读了一段时间后,我发现staticmethod还有一个__init__在初始化期间加载文件的。class Permi…

Eclipse手动配置svn

1、在Eclipse根目录下建一个任意文件夹&#xff08;如plugin&#xff09;&#xff0c;在该文件夹下建一个以该插件名命名的文件夹&#xff08;如SVN&#xff09;。2、将下载下的插件文件解压&#xff0c;plugins和features文件夹复制到该文件夹下&#xff08;SVN&#xff09;。…

java爬虫新浪微博_java爬虫(爬新浪新闻) 如何从零开始

爬虫通常搜索引擎处理的对象是互联网网页。首先面临的问题是&#xff1a;如何能够设计出高效的下载系统&#xff0c;以将如此海量的网页数据传送到本地&#xff0c;在本地形成互联网网页的镜像备份。网络爬虫即起此作用&#xff0c;它是搜索引擎系统中很关键也很基础的构件。爬…

Hibernate Query 的 list 和iterate方法缓存的区别

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…