【Treap】【TYVJ 1728】普通平衡树

data.finger-tree, Finger树数据结构.zip data.finger-tree, Finger树数据结构 的手指树Finger树是完全持久的集合的通用系列。 这里库包含你需要自己创建的所有内容,以及一些ready-to-use集合类型:为左和右两端提供常量时间访问的顺序集合为连续的集合。counted-double-list 提供 立即下载

1829. [Tyvj 1728]普通平衡树

★★   输入文件:phs.in   输出文件:phs.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

【输入格式】

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

【输出格式】

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

【样例输入】

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

【样例输出】

106465
84185
492737

【提示】

1.n的数据范围:n<=100000
2.每个数的数据范围:[-1e7,1e7]

* 题解:*

平衡树模板题,全是基础操作。新学者可当成模板学习。

Code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
struct node{
    node *left,*right;
    int v,p,cnt,sz;
}*root,*null=new node((node){null,null,0,0,0,0});
int in(){
    int x=0; char ch=getchar(); bool f=true;
    while (ch<'0' || ch>'9'){
        if (ch=='-') f=false;
        ch=getchar();
    }
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    if (!f) x=-x;
    return x;
}
void push_up(node *x){
    x->sz=x->left->sz+x->right->sz+x->cnt;
}
void lturn(node *&x){
    node *y=x->right;
    x->right=y->left; y->left=x;
    y->sz=x->sz; push_up(x); x=y;
}
void rturn(node *&x){
    node *y=x->left;
    x->left=y->right; y->right=x;
    y->sz=x->sz; push_up(x); x=y;
}
void Insert(node *&x,int k){
    if (!x->sz){
        x=new node;
        x->left=x->right=null;
        x->v=k; x->p=rand();
        x->sz=x->cnt=1;
        return;
    }
    x->sz++;
    if (k==x->v) x->cnt++;
    else if (k>x->v){
        Insert(x->right,k);
        if (x->right->p<x->p) lturn(x);
    }
    else {
        Insert(x->left,k);
        if (x->left->p<x->p) rturn(x);
    }
}
void Delete(node *&x,int k){
    if (!x->sz) return;
    if (k==x->v){
        if (x->cnt>1) x->cnt--,x->sz--;
        else if (!x->left->sz || !x->right->sz){
            node *t=x;
            if (!x->left->sz) x=x->right;
            else x=x->left;
            delete t;
        }
        else if (x->left->p<x->right->p)
            rturn(x),Delete(x,k);
        else lturn(x),Delete(x,k);
    }
    else if (k<x->v) x->sz--,Delete(x->left,k);
    else x->sz--,Delete(x->right,k);
}
int Q_rank(node *x,int k){
    if (!x->sz) return 0;
    if (k==x->v) return x->left->sz+1;
    else if (k<x->v) return Q_rank(x->left,k);
    else return Q_rank(x->right,k)+x->left->sz+x->cnt;
}
int Q_num(node *x,int k){
    if (!x->sz) return 0;
    if (k<=x->left->sz) return Q_num(x->left,k);
    else if (k>x->left->sz+x->cnt)
        return Q_num(x->right,k-x->left->sz-x->cnt);
    else return x->v;
}
int Q_pro(node *x,int k,int c){
    if (!x->sz) return c;
    if (k>x->v) return Q_pro(x->right,k,x->v);
    else return Q_pro(x->left,k,c);
}
int Q_suc(node *x,int k,int c){
    if (!x->sz) return c;
    if (k<x->v) return Q_suc(x->left,k,x->v);
    else return Q_suc(x->right,k,c);
}
int main(){
    int n=in(); root=null; srand(time(0));
    while (n--){
        int opt=in(),x=in();
        switch (opt){
            case 1:Insert(root,x); break;
            case 2:Delete(root,x); break;
            case 3:printf("%d\n",Q_rank(root,x)); break;
            case 4:printf("%d\n",Q_num(root,x)); break;
            case 5:printf("%d\n",Q_pro(root,x,0)); break;
            case 6:printf("%d\n",Q_suc(root,x,0)); break; 
        }
    }
    return 0;
}
FingerTree:同名通用纯功能数据结构的Scala实现。 https的镜像 手指树 陈述 FingerTree是Scala编程语言中的不变序列数据结构,提供O(1)前置和追加以及一系列其他有用的属性[^ 1]。 手指树可用作队列,双端队列,优先级队列,索引序列和求和序列的构建块。 FingerTree是Hanns Holger Rutz的(C)版权2011–2020。 版权所有。 它是根据v2.1 +,绝对没有任何担保。 要与作者联系,请发送电子邮件至contact at sciss.de 。 当前的实现是对先前版本的重写。 它试图结合在Scalaz中发现的手指树(主要是具有减少器/度量的能力)和Daniel Spiewak所实现的手指树(较小,独立,更简单,更快)的优点,但还具有更多的优点。惯用的Scala界面,并附带了一系列有用的应用程序,例如索引和求和序列。 [^ 1] Hinze,R.和Paterson,R.,《手指树:一种简单的通用数据结构》,《函 立即下载

相关推荐

finger-tree:JavaScript 的手指树数据结构

:cactus: JavaScript 的手指树。 请参阅。 父级是 。 data FingerTree x = Empty | Single x | Deep ( Digit x ) ( FingerTree ( Node x ) ) ( Digit x ) :woman_teacher: 接口参考 :cactus: Tree定义 :straight_ruler: Measure定义Measure示例 :package: 如何import :baby: 如何创建一Tree empty(Measure) -> Tree from(Measure, Iterable) -> Tree :red_question_mark: 谓词 Tree#measure() -> m Tree#isEmpty() -> Boolean :salt: 添加值 Tree#push(x) -> Tree Tree#cons(x) -> Tree Tree#a

BZOJ 3224: Tyvj 1728 普通平衡树

题目 3224: Tyvj 1728 普通平衡树 Time Limit:10 SecMemory Limit:128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x...

weixin_30907935的博客 276

js-fingertree:JavaScript的手指树数据结构

:cactus: JavaScript的手指树。 参见 。 父母是 。 data FingerTree x = Empty | Single x | Deep ( Digit x ) ( FingerTree ( Node x ) ) ( Digit x ) ‍:school: API参考 数据结构是 :所有方法都是纯函数,不会修改其对象。 显示了如何在这些方法之上构建专用的持久性数据结构。 :cactus: 一Tree定义 data Tree x = Empty | Sing

Clojure中的Finger Tree数据结构指南

Clojure中的Finger Tree数据结构指南 1. 项目介绍 Finger Tree是一种高效的数据结构,特别是在纯函数式编程环境中,由Clojure社区维护的data.finger-tree库实现了这一结构。它允许常数时间访问树的边缘节点(即“手指”),以及对序列的拼接和分割操作以对较小部分进行对数时间处理。这种数据结构非常适合于实现高效的集合和序列操作,尤其是在需要保持数据不可变性的场...

gitblog_00596的博客 617

嵌入式调光控制库:轻量级软启/渐变/记忆逻辑实现

调光控制是智能照明系统的核心基础功能,涉及亮度调节、人机交互与电气安全多重需求。其底层原理依赖于对相位角或PWM占空比的精确时序控制,并需融合软启动、渐变过渡、状态记忆等工程化逻辑。这类轻量级调光行为逻辑层,不直接操作硬件寄存器,而是以确定性、无动态内存、可配置的方式封装用户意图到目标亮度值(0–100%)的映射过程,显著提升产品鲁棒性与跨平台复用能力。广泛应用于TRIAC交流调光、LED直流PWM驱动及DALI/Matter等智能照明协议网关中,尤其适合资源受限的Cortex-M系列MCU和FreeRTO

weixin_28949937的博客 579

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 398

探秘 Finger Trees:高效持久化集合的魔法

探秘 Finger Trees:高效持久化集合的魔法 Finger Trees,一种强大且完全持久化的集合类型,为您提供了构建自己数据结构所需的一切工具。这个开源库不仅包含了基础框架,还预设了几个即刻可用的集合类型,如双端列表、计数双端列表和计数排序集。让我们深入了解它们的精髓并发现其无尽潜力。 1、项目介绍 Finger Trees 源自 Ralf Hinze 和 Ross Paterson 的...

gitblog_00044的博客 495

通讯模块_三菱IQ-R PLC串口通讯模块RJ71C24进行Modbus-RTU通讯

在日常的选型中,很多电气工程师咨询我,三菱iQ-R系列有没有Modbus通讯模块,我在这里可以肯定的回复您,这个肯定是有的;我们共有三种可以选择分别是RJ71C24、RJ71C24-R2、RJ71C24-R4。RJ71C24系列支持MC协议通信、通信协议通信、无顺序协议通信、双向协议通信全、MODBUS通信。当我帮助他们选型之后,他们在使用的时候,又是一头雾水。那么今天我抽一些时间讲解一RJ71...

weixin_39878549的博客 9269

『数据结构』树

1. 概念 2. 二叉查找树 2.1. 随机构造的二叉查找树 2.2. 平均结点深度 2.3. 不同的二叉树数目 (Catalan num) 2.4. 好括号列 3. 基数树 (radixTree) 4. 字典树 (trie) 4.1. AC 自动机 5. 平衡二叉树 5.1. AVL Tree 5.2. splayTree 5.2.1. Zig-step 5.2.2. Zig-zi...

mbinary 487

汇付天下聚合支付自助接入全流程详解(附JAVA/非JAVA环境配置指南)

本文详细解析了汇付天下聚合支付的自助接入全流程,涵盖JAVA与非JAVA环境下的实战配置。从接入前准备、架构理解、密钥获取,到JAVA SDK集成、核心支付代码拆解,以及Node.js/Python等环境的裸接口对接、签名生成与异步通知处理,提供了完整的避坑指南和上线检查清单,帮助开发者高效、稳健地完成支付系统集成。

wdx01234567的博客 511

结构光三维重建2——多频外差解包裹

本文深入解析了结构光三维重建中的多频外差解包裹技术。针对四步相移法产生的相位包裹问题,该方法通过投影多组不同频率的条纹光,利用外差原理逐级解算,最终获得精确、连续的绝对相位值,是实现高精度、稳健三维重建的关键步骤。

weixin_29056101的博客 350

探索高效数据结构:Finger Trees 开源库推荐

探索高效数据结构:Finger Trees 开源库推荐 项目介绍 Finger Trees(手指树)是一种多功能的全持久化集合,广泛应用于各种数据结构的实现中。本开源项目提供了一个完整的Finger Trees库,不仅包含了构建自定义Finger Trees所需的所有工具,还预置了几种常用的集合类型,如double-list、counted-double-list和counted-sorted-s...

gitblog_01066的博客 903

使用podman 容器化安装DIFY

本文阐述了使用podman容器化安装DIFY的过程

wengad的博客 1901

BZOJ 3224: Tyvj 1728 普通平衡树【Treap】

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

aiweiluan5095的博客 188

基于STM32设计的环境监测系统(华为云IOT)_300

随着空气污染问题日益严峻,环境空气质量的监测变得愈加重要。为了解决这一问题,本项目设计并实现了一款基于STM32的空气质量监测设备,能够实时监测空气中的温湿度、二氧化碳浓度和甲醛浓度,并通过OLED显示屏展示数据。此外,设备支持通过WIFI模块将数据上传至云端,用户可以通过手机APP或Windows上位机查看实时数据。设备采用MQTT协议与华为云IOT物联网服务器进行数据通信,确保数据的实时性和可靠性。本项目还结合了低功耗设计和高灵敏度传感器,使得设备能够高效稳定地运行,并实现远程监控功能。

695

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bzoj 3224: Tyvj 1728 普通平衡树 Treap

平衡树的基本操作(←现在才会的SB)。直接裸上Treap即可,(不要问我为什么这么像黄学长的,因为我的数据结构都是按他的模板来的)。 AC代码如下: #include #include #include #define N 100005 using namespace std; int n,trtot,rt,ans,c[N][2],sz[N],sum[N],rd[N],val[N]; int

lych的博客 510

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[bzoj 3224] Tyvj 1728 普通平衡树{Treap}

题目 https://www.lydsy.com/JudgeOnline/problem.php?id=3224 解题思路 Treap\large TreapTreap 第二次打平衡树的题目(不,应该说是模板)。 代码 #include <cstdio> #include <cstdlib> using namespace std; const int SIZE=10...

Nowed 291

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)

BZOJ 3224 Tyvj 1728 普通平衡树题目概述:给n个操作,有6种操作: 1.插入一个数 2.删除一个数(若该数有多个,那么只删除一个) 3.查询一个数的排名(若有多个,取最小) 4.查询一个排名对应数 5.查询一个数的前驱(小于该数的最大数) 6.查询一个数的后继(大于该数的最小数)题目分析:如题目,是一道平衡树的版题,可以选择使用Treap实现.注意可能会有相同的数出现,

Continue 1223

带旋平衡树treap(tyvj1728普通平衡树)

平衡树treap(带旋treap) 带旋treap 注意左右旋转可以合并,d=1时 左儿子上旋至根节点,d==0时右儿子上旋至根节点 代码见下: void zhuan(int &x,int d){//旋转,d=1是左儿子上旋 int son=t[x].ch[d]; t[x].ch[d]=t[son].ch[d^1]; t[son].ch[d^1]=x; up(x),up(x...

avenLJY的博客 298

bzoj 3224: Tyvj 1728 普通平衡树 treap

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4464  Solved: 1813 [Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数

whai的专栏 707

【模板】【bzoj3224】Tyvj 1728 普通平衡树 Treap

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

DQS的树洞 951

BZOJ3224 Tyvj 1728 普通平衡树(Treap)

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ3224 正解:$Treap$ 解题报告:   $Treap$其实就是二叉搜索树啦,加入了随...

dgoh41514的博客 199

[BZOJ3224]Tyvj 1728 普通平衡树 && treap

逗号打成分号搞了好久 艹艹艹 #include #include #include #include #include #define SF scanf #define PF printf using namespace std; typedef long long LL; inline int read() { int x=0, f=1; char ch=getchar();

shiyukun1998的专栏 558

BZOJ 3224 Tyvj 1728 普通平衡树——treap

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

CHN_JZ的博客 947

【treap模板】【TyvJ 1728】【普通平衡树】

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

22ssm的博客 469
上一篇: 【线段树】【树状数组】【CF 121E】幸运数列
下一篇: 【平衡树】【NOI 2005】维护数列
morestep
博客等级 码龄12年 20粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值