【洛谷P3369】【模板】普通平衡树【Treap】

使用Simulink对基于GaN器件的高频电源进行建模与仿真,重点在于优化其效率 本文介绍了基于Simulink的GaN器件高频电源仿真建模方法。通过7个步骤详细讲解系统构建过程:从创建模型、设置电源、配置GaN开关网络,到添加磁性元件、负载和控制器设计,最后进行仿真分析。重点探讨了效率优化策略,包括开关频率选择、磁性元件优化、散热设计改进及控制策略调整。该教程为GaN器件在电力电子系统中的应用提供了完整的仿真流程指导,有助于设计人员验证方案并优化性能。 阅读详情

题目大意:

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

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

思路:

总算学会敲TreapTreapTreap的模板的啊,感觉这样下去菜的很快就要退役啊。
都上初三了才学会最基础的平衡树。
暑假也没有怎么刷题,真的是颓废了啊。


维护一棵BSTBSTBST,满足任意节点的左子树中的节点全部小于这个点,右子树中的节点全部大于这个点。然后这样就可以相对简单的完成上述操作。

  • 插入
    这个直接在数中根据BSTBSTBST的性质来找到这个点的位置,然后插入即可。动态开点。
  • 删除
    TreapTreapTreap其实就是随机旋转的BSTBSTBST,那么就把要删除的点旋转到叶子节点处,然后直接删除即可。
    注意对于每一个数字要记录一个cntcntcnt,表示这个数字出现的次数。如果cnt>1cnt>1cnt>1那么直接cnt−−cnt--cnt−−即可,不需要删除。
  • 查询排名
    这个很简单,利用BSTBSTBST的性质找到这个节点,然后利用子树的大小就可以求出排名。
  • 查询数字
    用给出的排名,到每一个节点时判断应该往左儿子走还是往右儿子走,找到这个数字输出即可。
    注意查询前把排名加1,因为初始化时我们要在BSTBSTBST中插入两个数+∞,−∞+\infty,-\infty+∞,−∞,所以−∞-\infty−∞的排名一定是1。
  • 查询前驱
    显然,假设已经到达节点的权值为xxx,查找的是valvalval的前驱。那么如果x&lt;valx&lt;valx<val,那么答案一定在该节点以及该节点的右子树中,答案即为max(x,{y∣y∈rson})max(x,\{y|y\in rson\})max(x,{y∣y∈rson})。否则答案就在该节点的左子树内。
  • 查询后继
    其实查询后继和查询前驱基本没有什么区别,改一下就行了。

码亮远远没有我想象的那么长,原本以为有200+200+200+,结果只打了156156156行,对于我这种码风来说已经可以了。
注意为了保持BSTBSTBST相对平衡,需要随机旋转BSTBSTBST使得BSTBSTBST深度较小。


代码:

#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=100010,Inf=1e9;
int n,x,opt,root,tot;

struct Treenode
{
	int lc,rc,cnt,val,size,dat;
};

struct Treap
{
	Treenode t[N];
	
	int New(int val)
	{
		t[++tot].val=val;
		t[tot].dat=rand();
		t[tot].cnt=t[tot].size=1;
		return tot;
	}
	
	void update(int x)
	{
		t[x].size=t[t[x].lc].size+t[t[x].rc].size+t[x].cnt;
	}
	
	void build()
	{
		root=New(-Inf);
		t[1].rc=New(Inf);
		update(1);
	}
	
	void zig(int &x)
	{
		int y=t[x].lc;
		t[x].lc=t[y].rc; t[y].rc=x; x=y;
		update(t[x].rc); update(x);
	}
	
	void zag(int &x)
	{
		int y=t[x].rc;
		t[x].rc=t[y].lc; t[y].lc=x; x=y;
		update(t[x].lc); update(x);
	}
	
	void insert(int &x,int val)
	{
		if (!x)
		{
			x=New(val);
			return;
		}
		if (t[x].val==val)
		{
			t[x].cnt++;
			update(x);
			return;
		}
		if (val<t[x].val)
		{
			insert(t[x].lc,val);
			if (t[x].dat<t[t[x].lc].dat) zig(x);
		}
		else
		{
			insert(t[x].rc,val);
			if (t[x].dat<t[t[x].rc].dat) zag(x);
		}
		update(x);
	}
	
	void del(int &x,int val)
	{
		if (!x) return;
		if (t[x].val==val)
		{
			if (t[x].cnt>1)
			{
				t[x].cnt--;
				update(x);
				return;
			}
			if (t[x].lc || t[x].rc)
			{
				if (!t[x].lc || t[t[x].rc].dat>t[t[x].lc].dat)
					zag(x),del(t[x].lc,val);
				else
					zig(x),del(t[x].rc,val);
				update(x);
			}
			else x=0;
			return;
		}
		if (val<t[x].val) del(t[x].lc,val);
			else del(t[x].rc,val);
		update(x);
	}
	
	int get_rank(int x,int val)
	{
		if (!x) return 0;
		if (val==t[x].val) return t[t[x].lc].size+1;
		if (val<t[x].val) return get_rank(t[x].lc,val);
			else return get_rank(t[x].rc,val)+t[t[x].lc].size+t[x].cnt;
	}
	
	int get_val(int x,int rank)
	{
		if (!x) return Inf;
		if (t[t[x].lc].size+1<=rank && t[t[x].lc].size+t[x].cnt>=rank)
			return t[x].val;
		if (rank<=t[t[x].lc].size) return get_val(t[x].lc,rank);
			else return get_val(t[x].rc,rank-t[t[x].lc].size-t[x].cnt);
	}
	
	int pre(int x,int val)
	{
		if (!x) return -Inf;
		if (t[x].val<val) return max(t[x].val,pre(t[x].rc,val));
			else return pre(t[x].lc,val);
	}
	
	int next(int x,int val)
	{
		if (!x) return Inf;
		if (t[x].val>val) return min(t[x].val,next(t[x].lc,val));
			else return next(t[x].rc,val);
	}
}Treap;

int main()
{
	srand(time(0));
	scanf("%d",&n);
	Treap.build();
	while (n--)
	{
		scanf("%d%d",&opt,&x);
		if (opt==1) Treap.insert(root,x);
		if (opt==2) Treap.del(root,x);
		if (opt==3) printf("%d\n",Treap.get_rank(root,x)-1);
		if (opt==4) printf("%d\n",Treap.get_val(root,x+1));
		if (opt==5) printf("%d\n",Treap.pre(root,x));
		if (opt==6) printf("%d\n",Treap.next(root,x));
	}
	return 0;
}
私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站 私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站。 阅读详情

相关推荐

ROG幻16Air新机避坑:Ubuntu 22.04下NVIDIA驱动、CUDA与Isaac Gym的兼容性实战

本文详细记录了在ROG幻16Air新机上安装Ubuntu 22.04,并成功配置NVIDIA驱动、CUDA与Isaac Gym强化学习开发环境的完整实战过程。针对官方文档未明确支持Ubuntu 22.04的挑战,文章提供了从驱动安装、CUDA版本选择、Python虚拟环境搭建到Isaac Gym兼容性调试的一站式解决方案,帮助开发者在新硬件上高效部署机器人仿真与训练平台。

weixin_28419039的博客 220

普通平衡树

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1.插入数值 x。 2.删除数值 x(若有多个相同的数,应只删除一个)。 3.查询数值 x 的排名(若有多个相同的数,应输出最小的排名)。 4.查询排名为 x 的数值。 5.求数值 x 的前驱(前驱定义为小于 x 的最大的数)。 6.求数值 x 的后继(后继定义为大于 x 的最小的数)。 注意: 数据保证查询的结果一定存在。 输入格式 第一行为 n,表示操作的个数。 接下来 n 行每行有两个数 opt 和 x,opt 表示操作的序

m0_56740685的博客 701

Bentley ORD(openroads designer) 二次开发(BIM)第七节 在ORD SDK中调用MicroStation SDK

从课程刚开始的时候我们就通过学习,了解了ORD的开发是基于MicroStation的,ORD SDK的接口发布的时候也对MicroStation SDK也做了一次发布。这一章将以我们对ORD SDK知识的了解为基础,使用ORD SDK的接口读取道路几何信息、计算桩号,然后再使用MicroStation SDK 读取地形数据和计算投影点的位置,并创建一组方柱形状的Soild。计算方柱底部坐标要经过两大步骤,通过路线的桩号及偏移距离去定位方柱的平面位置,通过方柱的平面位置计算数字地面模型上的投影点的坐标。

chen286990651的博客 880

洛谷P3369 【模板】普通平衡树 红黑树实现

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:一、红黑树定义红黑树的英文是“Red-Black Tree”,简称 R-B Tree,它是一种不严格的平衡二叉查找树二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。红黑树是一种含有红色和黑色节点并能自平衡的二叉查找树,红黑树和其他二叉查找树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的性质,从而获得较高的查找性能。它虽

DaoCaoRen___的博客 785

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。往往参照《土壤侵蚀分类分级标准》,将植被覆盖度划分为4个等级:<30%为低覆盖度、30%—45%为中低覆盖度、45%—60%为中覆盖度、>60%为高覆盖度。本数据集包括1986至2022年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。

地球资源数据云的官方博客 1966

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 320

【ACWing】253. 普通平衡树

题目地址: https://www.acwing.com/problem/content/255/ 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(以下排名都是指从小到大的排名。并列的数也要算进去): 1、插入数值xxx。 2、删除数值xxx(若有多个相同的数,应只删除一个)。 3、查询数值xxx的排名(若有多个相同的数,应输出最小的排名)。 4、查询排名为xxx的数值。 5、求数值xxx的前驱(前驱定义为小于xxx的最大的数)。 6、求数值xxx的后继(后继定义为大于xxx的最

数学、算法爱好者的博客 603

BPMN-JS :修改节点“Change Type”事件类型

修改路径:node_modules\bpmn-js\lib\features\replace\ReplaceOptions.js。

TaylorY的博客 679

【学校OJ】avl平衡树 普通平衡树

题目描述 你需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入一个整数x 2. 删除一个整数x(若有多个相同的数,只删除一个) 3. 查询整数x的排名(若有多个相同的数,输出最小的排名),相同的数依次排名,不并列排名 4. 查询排名为x的数,排名的概念同3 5. 求x的前驱(前驱定义为小于x,且最大的数),保证x有前驱 6. 求x的后继(后

Starlight的博客 1031

正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真

调节方波信号的占空比,也就是改变输出信号的高低电平时间比例,可以设置电容不同的充放电时间来达到目的,RP2可以使得电容具有不同的充放电时间,其中二极管起到限制电流流向的作用。假设U+>U,那么输出端就达到正向饱和,电容开始充电,当电容电压大于同相输入端电压时,此时电容开始放电,由此往复,从而产生方波信号。3,正反馈支路占优势,电路开始起振并不是稳定的,振荡会不断增大,最终将导致运放饱和,输出的波形是削波失真的正弦波。通常在电路中引入负反馈,例如使用负温度系数的热敏电阻,以自动稳定增益,防止输出波形失真。

XU157303764的博客 5320

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 479

洛谷 P3369 【模板】普通平衡树 (Treap)

题目链接:P3369 【模板】普通平衡树 题意 构造一种数据结构满足给出的 6 种操作。 思路 平衡树 平衡树的模板题。 先学习了一下 Treap。 模板来自《算法竞赛进阶指南》。 代码 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; const int inf = 0x3f3f...

G19850917的博客 339

端侧 AI 落地避坑指南(中):为什么 QAT 救不了精度?——对齐“融合后算子“的硬件物理约束

在上一篇文章中,我们深入探讨了量化的本质,并得出结论:QAT(量化感知训练)是保持精度的关键。明明做了 QAT,精度还是崩塌了!让我们看一个真实的案例:✅ 使用了✅ 配置了量化✅ 训练了 50 个 epoch,学习率降为原来的 1/10✅ 冻结了 BN 统计量FP32 模型:mAP = 0.85QAT 后 FP32:mAP = 0.84(正常)工具量化后:mAP = 0.68(崩塌!问题出在哪里?层融合(Layer Fusion)机制。

weixin_51988935的博客 55

洛谷P3369 【模板】普通平衡树 treap

网址:https://www.luogu.org/problem/P3369 题意: 编写一个数据结构在每次$O(logn)(1 \leq n \leq 1e6)$完成以下功能: 一、插入一个数到序列中;二、在序列中删除某一个数;三、找到第$k$大;四、询问第$k$大的数;五、找到$x$的前驱,六、找到$x$的后继。 题解: 很显然,二叉搜索树就可以完成这个任务,不过最坏情况下...

FairyTail0423的专栏 210

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

洛谷 P3369 【模板】普通平衡树 Treap/Splay

写一个数据结构来提供以下操作: 插入 xxx 删除 xxx (多个相同则只删除一个) 查询 xxx 的排名(从 111 开始数) 查询排名为 xxx 的数 求 xxx 的前驱 (前驱定义为 max⁡{k∣k<x}\max\{k|k<x\}max{k∣k<x}) 求 xxx 的后继 (后继定义为 min⁡{k∣k>x}\min\{k|k>x\}min{k∣k>x...

wineandchord 413

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

洛谷 P3369 【模板】普通平衡树(Treap/SBT)

P3369 【模板】普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名) 查询排名为x的数 ...

HJ921004的博客 224

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【模板】【Treap/SBT】【树堆】普通平衡树【洛谷P3369】

模板题目传送门 首先,我们介绍一下 TreapTreap(树堆)Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的同时,还满足堆的性质。这些优先级是是在结点插入时,随机赋予的,Treap根据这些优先级满足堆的性质。这样的话,Treap是有

jmsyzsfq的博客 1033

【笔记 & 题解 | FHQ Treap(可持久化)】洛谷P3369【模板】普通平衡树 & 洛谷 P3835 【模板】可持久化平衡树

平衡树团建。

Isaac Regulus的博客 1785

无旋treap/fhq-treap 模板 (附良心讲解 + 例题:洛谷P3369 普通平衡树)

博文更新: 20190917 更新了一下merge和split函数的递归理解 定义: 无旋treap,就是不通过旋转的维护堆性质的treap,根本的原理还是 tree + heap。 与普通treap的不同之处: 大概就是可以可持久化。 然后区间操作的话,不知道有旋的行不行,用无旋的反正是比较好搞,区间操作举个例子就是让你把一段区间的数反过来等等。 现在听着可能区间操作什么的可能莫名...

shadiao.的博客 955

洛谷 P3369 【模板】普通平衡树 【无旋treap、Splay、pb_ds】

题目链接 题意: 写一种数据结构,来维护一些数,其中需要提供以下操作: 插入 xx 数 删除 xx 数(若有多个相同的数,因只删除一个) 查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 ) 查询排名为 xx 的数 求 xx 的前驱(前驱定义为小于 xx,且最大的数) 求 xx 的后继(后继定义为大于 xx,且最小的数) 题解: 平衡树的模板题,但是treap相较于其他的BST更好写、更好理解 #include<iostream> #include<sstream>

qq_50554695的博客 398

[洛谷P3369]【模板】普通平衡树(Treap/SBT)

题目大意:给你一些操作: 1.插入一个数; 2.删除一个数; 3.输出x是第几小的数; 4.输出第k小的数是几; 5.输出比x小的最大数; 6.输出比x大的最小数。 要你实现它。 解题思路:平衡树模板题。 用Treap/Splay/替罪羊树/pbds(雾)等均可。 我使用简单的Treap实现。 注意在5和6操作时,必须要搜到叶子才停止,否则会遗漏答案。 这里用指针...

166

【Treap模板题】洛谷 P3369 【模板】普通平衡树

洛谷 P3369 【模板】普通平衡树 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数) 求x的后继(后继定义为大于x,且最小的数) 输入格式...

qq_41037114的博客 471

【模板】Treap (模板题:洛谷P3369普通平衡树)

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

Dance Of Faith 788

洛谷P3369 【模板】普通平衡树(FHQ Treap)

题面 传送门 题解 写了一下\(FHQ\ Treap\) //minamoto #include<bits/stdc++.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) ...

weixin_33849942的博客 141

洛谷P3369 模板 普通平衡树 (Treap)

Treap

weixin_46975572的博客 297
上一篇: 【洛谷P5461】赦免战俘【分形】
下一篇: 【洛谷P1486】郁闷的出纳员【Treap】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值