BZOJ 3224: Tyvj 1728 普通平衡树

3224: Tyvj 1728 普通平衡树

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

 

Source

平衡树

[Submit][Status][Discuss]

 

FHQ Treap

 

  1 #include <bits/stdc++.h>
  2 
  3 const int N = 500005;
  4 
  5 int ls[N], rs[N], vl[N], tg[N], sz[N];
  6 
  7 inline int node(int v)
  8 {
  9     static int t = 1;
 10     sz[t] = 1;
 11     vl[t] = v;
 12     tg[t] = rand();
 13     return t++;
 14 }
 15 
 16 int merge(int a, int b)
 17 {
 18     if (!a || !b)return a + b;
 19     if (tg[a] > tg[b])
 20     {
 21         rs[a] = merge(rs[a], b);
 22         sz[a] = 1 + sz[ls[a]] + sz[rs[a]];
 23         return a;
 24     }
 25     else
 26     {
 27         ls[b] = merge(a, ls[b]);
 28         sz[b] = 1 + sz[ls[b]] + sz[rs[b]];
 29         return b;
 30     }
 31 }
 32 
 33 void split(int t, int k, int &a, int &b)
 34 {
 35     if (!t)a = b = 0;
 36     else
 37     {
 38         if (vl[t] <= k)
 39             a = t, split(rs[t], k, rs[t], b);
 40         else
 41             b = t, split(ls[t], k, a, ls[t]);
 42         sz[t] = 1 + sz[ls[t]] + sz[rs[t]];
 43     }
 44 }
 45 
 46 int kth(int t, int k)
 47 {
 48     if (k <= sz[ls[t]])
 49         return kth(ls[t], k);
 50     else if (k == sz[ls[t]] + 1)
 51         return t;
 52     else   
 53         return kth(rs[t], k - sz[ls[t]] - 1);
 54 }
 55 
 56 signed main(void)
 57 {
 58     srand(5264);
 59     
 60     int n, r = 0; scanf("%d", &n);
 61 
 62     for (int a, b, x, y, z; n--; )
 63     {
 64         scanf("%d%d", &a, &b);
 65 
 66         if (a == 1)
 67         {
 68             split(r, b, x, y);
 69             r = merge(x, node(b));
 70             r = merge(r, y);
 71         }
 72         else if (a == 2)
 73         {
 74             split(r, b, x, z);
 75             split(x, b - 1, x, y);
 76             y = merge(ls[y], rs[y]);
 77             r = merge(x, y);
 78             r = merge(r, z);
 79         }
 80         else if (a == 3)
 81         {
 82             split(r, b - 1, x, y);
 83             printf("%d\n", sz[x] + 1);
 84             r = merge(x, y);
 85         }
 86         else if (a == 4)
 87             printf("%d\n", vl[kth(r, b)]);
 88         else if (a == 5)
 89         {
 90             split(r, b - 1, x, y);
 91             printf("%d\n", vl[kth(x, sz[x])]);
 92             r = merge(x, y);
 93         }
 94         else
 95         {
 96             split(r, b, x, y);
 97             printf("%d\n", vl[kth(y, 1)]);
 98             r = merge(x, y);
 99         }
100     }
101 }  

 

 1 #include <bits/stdc++.h>
 2 const int N = 500005;
 3 int ls[N], rs[N], vl[N], tg[N], sz[N], tot = 1;
 4 int node(int v) {
 5     return vl[tot] = v, sz[tot] = 1, tg[tot] = rand(), tot++;
 6 }
 7 int merge(int a, int b) {
 8     if (!a || !b)return a + b;
 9     if (tg[a] > tg[b]) {
10         rs[a] = merge(rs[a], b);
11         sz[a] = 1 + sz[ls[a]] + sz[rs[a]];
12         return a;
13     }
14     else {
15         ls[b] = merge(a, ls[b]);
16         sz[b] = 1 + sz[ls[b]] + sz[rs[b]];
17         return b;
18     }
19 }
20 int split(int t, int k, int &a, int &b) {
21     if (!t)return a = b = 0, 0;
22     if (vl[t] <= k)
23         a = t, split(rs[t], k, rs[t], b);
24     else
25         b = t, split(ls[t], k, a, ls[t]);
26     return sz[t] = 1 + sz[ls[t]] + sz[rs[t]];
27 }
28 int kth(int t, int k) {
29     return k <= sz[ls[t]] ? kth(ls[t], k) : ((k -= sz[ls[t]] + 1) ? kth(rs[t], k) : vl[t]);
30 }
31 signed main(void) {
32     int n, r = 0, a, b, x, y, z;
33     for (scanf("%d", &n); n--; ) {
34         scanf("%d%d", &a, &b);
35         if (a == 1)
36             split(r, b, x, y), r = merge(merge(x, node(b)), y);
37         else if (a == 2)
38             split(r, b, x, z), split(x, b - 1, x, y), r = merge(merge(x, merge(ls[y], rs[y])), z);
39         else if (a == 3)
40             split(r, b - 1, x, y), printf("%d\n", sz[x] + 1), r = merge(x, y);
41         else if (a == 4)
42             printf("%d\n", kth(r, b));
43         else if (a == 5)
44             split(r, b - 1, x, y), printf("%d\n", kth(x, sz[x])), r = merge(x, y);
45         else
46             split(r, b, x, y), printf("%d\n", kth(y, 1)), r = merge(x, y);
47     }
48 }

 

 

@Author: YouSiki

转载于:https://www.cnblogs.com/yousiki/p/6224736.html

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

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

相关文章

springboot中配置mybatis数据源,使用阿里的 Druid 数据库连接池

参考了很多文章&#xff0c;记录下自己的学习过程&#xff01; 参考&#xff1a;https://blog.csdn.net/weixin_40776321/article/details/99633110 1. 在pom.xml中添加依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>dr…

Linux C 算法——查找

所谓“查找”记为在一个含有众多的数据元素&#xff08;或记录&#xff09;的查找表中找出某个“特定的”数据&#xff0c;即在给定信息集上寻找特定信息元素的过程。 为了便于讨论&#xff0c;必须给出这个“特定的”词的确切含义。首先&#xff0c;引入一个“关键字”的概念&…

SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结

第一次SP项目总监遇到各种问题&#xff0c;以下是总结&#xff1a;问题1.创建SP项目的时候“场解决方案”跟“沙盒解决方案”是有区别的&#xff0c;具体可以看MSDN官方文档&#xff0c;这里简单摘抄如下&#xff1a;1&#xff09;场解决方案&#xff1a;承载与W3WP.exe中&…

ECharts学习(1)--简单图表的绘制

1.获取ECharts 官网 下载&#xff1a;http://echarts.baidu.com/download.html 2.在html页面中引入ECharts文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>ECharts练习</title><script type"text/javas…

php配置xdebug断点调试

环境&#xff1a;mac 10.15.4 zcmzcmdeMacBook-Pro 20190902 % php -v PHP 7.4.9 (cli) (built: Aug 7 2020 19:23:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologieswith Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick R…

Linux C 算法——排序

排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的序列。 为了方便讨论&#xff0c;在此首先要对排序下一个确切的定义&#xff1a; 假设含有n个记录的序列为 { R1、R2、&#xff0c;。。。Rn } 其相应的关键字序列为 {K1、K2&#xff0c;。。。。Kn}…

HTTP错误代码

服务器错误代码大全 400 - 错误的请求。 401 - 访问被拒绝。IIS 定义了许多不同的 401 错误&#xff0c;它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示&#xff0c;但不在 IIS 日志中显示&#xff1a; 401.1 - 登录失败。 401.2 - 服务器配置导致登录失败。 4…

UIKit封装的系统动画

简介 在UIKit中&#xff0c;对UIView封装了很多类方法来进行简单的动画实现&#xff0c;在动画过程中&#xff0c;通过对属性值的修改来完成一系列的效果。 在IOS4以前&#xff0c;主要通过 beginAnimation setAnimationDuration:设置动画时长 setAnimationDelay:设置延迟时…

MS SQL Server2008大数、小数转varchar

HTJE在表中的字段类型为float(53) 试了下str, cast和convert&#xff0c;发现对于小数或大数&#xff0c;多少都存在一些问题&#xff0c;最后经过尝试终于找到一种满意的答案&#xff1a; select cast(HTJE as decimal(20,2)) from T_HTGL where ID 1002993 对于金额部分&…

oracle那些基本知识

Oracle创建表空间、创建用户以及授权 、查看权限 rownum 分页查询 它是oracle系统顺序分配为从查询返回的行的编号&#xff0c;返回的第一行分配的是1&#xff0c;第二行是2&#xff0c;依此类推&#xff0c;这个伪字段可以用于限制查询返回的总行数&#xff0c;而且rownum不能…

JSON.parse 解析json字符串时,遇换行符报错

Json字符串转换成Json对象时候&#xff0c;有两种方式&#xff1a; 假设d是json字符串&#xff1a; 1&#xff0c;eval(( d ))。 2&#xff0c;JSON.parse(d)&#xff1b; 但是以上方式有隐患&#xff0c;如果Json字符串有换行的话&#xff0c;这样转换就会报错。 假如有…

jqueryui dialog asp.net服务端控件失效问题解决

最近使用jQuery Dialog做添加功能&#xff0c;发现服务端控件全部失效。 查资料是因为Dialog层被appendto 到了 body里&#xff0c;不在form里。 但网上给的解决方案我都不满意&#xff0c;觉得jQueryUI不会忽略这个问题&#xff0c;就查了API。 发现这个属性appendTo $( "…

用ASP生成RSS

<% Response.Clear Response.CharSet"gb2312" 数据集 Response.ContentType"text/xml" 数据流格式定义 Response.Write "<?xml version""1.0"" encoding""gb2312""?>"&vbNewLinesRssHea…

PHP中全局变量的使用global和$GLOBALS[]

From: http://blog.csdn.net/happyqyt/article/details/7219889 用PHP开发项目&#xff0c;不可避免的会使用到全局变量&#xff0c;比如一些网站的配置信息&#xff0c;全站通用&#xff0c;那就可以在一个地方设置&#xff0c;然后多个地方调用。 把变量定义为全局变量可以有…

PHP中常见错误

1、Notice: Undefined variable: 变量名 in 注&#xff1a;使用了一个没有被定义的变量 2、Parse error: syntax error, unexpected T_ELSE in If () { }Else if () { } Echo $test; Else { } 注&#xff1a;是 if else if else 句式错误 3、Parse error: syntax er…

文件I/O和标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O&#xff1a; 文件I/O&#xff1a;文件I/O称之为不带缓存的IO&#xff08;unbuffered I/O)。不带缓存指的是每个read&#xff0c;write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务&#xff0c;与os…

程序集、应用程序配置及App.config和YourSoft.exe.config .

转自&#xff1a;http://www.cnblogs.com/luminji/archive/2010/10/21/1857339.html 什么是程序集 程序集标识属性 强名称的程序集 强名称工作原理配置文件使用 DEVPATH 查找程序集指定要使用的运行库版本Appconfig和YourSoftexeconfig本章概要&#xff1a; 1&#xff1a;什么是…

用GDB调试程序(一)

GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许&#xff0c;各位比较喜欢那种图形界面方式的&#xff0c;像VC、BCB等IDE的调试&#xff0c;但如果你是在UNIX平台下做软件&#xff0c;你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大…

程序员必须注意的十大编程禁忌

一、不提升非技术技能我们认为非技术技能是项目成功的主要因素。这些非技术技能也可以称之为“软技能”&#xff0c;总体上来说&#xff0c;它已经被公司证明为能够驾驭企业和客户之间的长期商业关系&#xff0c;因此也能决定公司的成长发展路径。一些关键的软技能指标包括&…