替罪羊树学习小记

二叉树——替罪羊树.ppt 1 引入替罪羊树的目的 2 替罪羊树的定义 3 替罪羊树的基本操作: 插入 删除 查询 立即下载

替罪羊树是一种没有旋转操作的二叉搜索树。

或者说就是一颗二叉搜索树,暴力的那种。

插入就是自上而下找到应该插入的地方而后插进去。

我们知道这样搞肯定是可以变成O(n)O(n)O(n)的深度

其复杂度的保证依赖于重构。

即一棵子树不平衡直接提出来重构成完全二叉树。

不平衡的定义为:
max(siz[x0],siz[x1])>siz[x]∗αmax(siz[x0],siz[x1])>siz[x]*\alphamax(siz[x0],siz[x1])>siz[x]∗α
α\alphaα一般取0.750.750.75

没有旋转的话删除会比较麻烦,需要找到左子树最右的点或右子树最左的点来替代,再把那个点删掉,所以这叫替罪羊树。

复杂度O(nlogn)O(nlogn)O(nlogn),天知道为什么

Code:

#include<cstdio>
#include<iostream>
#define al 0.75
#define x0 t[x][0]
#define x1 t[x][1]
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;

const int N = 1e5 + 5;

int Q, n, rt, op, x, t[N][2], siz[N], a[N], fa[N];
int d[N], d0;

int lr(int x) {return t[fa[x]][1] == x;}
void upd(int x) { siz[x] = siz[x0] + siz[x1] + 1;}

void ins(int &x, int k) {
	if(!x) { x = k; return;}
    int z = a[k] > a[x];
    ins(t[x][z], k); fa[t[x][z]] = x;
	upd(x);
}
int pd(int x) {return max(siz[x0], siz[x1]) > siz[x] * al;}
void rec(int x) {
	if(!x) return;
	rec(x0); d[++ d0] = x; rec(x1);
}
int dg(int l, int r) {
	if(l > r) return 0;
	int m = l + r >> 1, x = d[m];
	fa[t[x][0] = dg(l, m - 1)] = x;
	fa[t[x][1] = dg(m + 1, r)] = x;
	upd(x); return x;
}
int ft(int x, int k) {return a[x] == k ? x : ft(t[x][k > a[x]], k);}
int fr(int x) { return x1 ? fr(x1) : x;}
int fl(int x) { return x0 ? fl(x0) : x;}
void del(int x) {
	if(x0 && x1) {
		int p = x0;
		while(t[p][1]) p = t[p][1];
		a[x] = a[p]; x = p;
	}
	int p = x0 ? x0 : x1, y = fa[x], z = lr(x);
	fa[t[y][z] = p] = y;
	for(x = y; x; x = fa[x]) upd(x);
	if(x == rt) rt = p;
}

int gn(int x, int k) {
	if(!x) return 0;
	if(a[x] >= k) return gn(x0, k);
	return siz[x0] + 1 + gn(x1, k);
}
int fn(int x, int k) {
	if(siz[x0] + 1 == k) return x;
	if(siz[x0] >= k) return fn(x0, k);
	return fn(x1, k - siz[x0] - 1);
}
int gl(int x, int k) {
	if(!x) return 0;
	if(a[x] >= k) return gl(x0, k);
	int p = gl(x1, k);
	return p ? p : x;
}
int gr(int x, int k) {
	if(!x) return 0;
	if(a[x] <= k) return gr(x1, k);
	int p = gr(x0, k);
	return p ? p : x;
}

const int inf = 2147483647;

int main() {
    freopen("a.in", "r", stdin);
    freopen("a.out", "w", stdout);
    cin >> Q;
    
    a[++ n] = -inf; ins(rt, n);
    a[++ n] = inf; ins(rt, n);
    
    fo(ii, 1, Q) {
        scanf("%d %d", &op, &x);
        if(op == 1) {
            a[++ n] = x; siz[n] = 1;
            ins(rt, n);
            int cur = 0;
            x = n;
            for(; x; x = fa[x]) if(pd(x)) cur = x;
            if(cur) {
            	x = cur; d0 = 0, rec(x);
            	int y = fa[x], z = lr(x);
            	x = dg(1, d0);
            	fa[t[y][z] = x] = y;
            	if(rt == cur) rt = x;
			}
        }
        if(op == 2) del(ft(rt, x));
        if(op == 3) printf("%d\n", gn(rt, x));
        if(op == 4) printf("%d\n", a[fn(rt, x + 1)]);
        if(op == 5) printf("%d\n", a[gl(rt, x)]);
        if(op == 6) printf("%d\n", a[gr(rt, x)]);
    }
}
SQL-拼多多 面试题:连续3次为球队得分的球员名单 1.使用LAG开窗函数 筛选出 下一次和下下一次得分,并用进球时间进行排序。2.使用where筛选出值得嘉奖的球员。 阅读详情

相关推荐

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

替罪羊树(Scapegoat Tree)

替罪羊树,一种基于暴力重构的平衡树

KaiserWilheim的博客 3040

Linux下开机异常(fsck exited with status code 4)

Linux下开机异常事情是这样的,本来我呢跑着程序听着歌,结果忽然就死机了,我只能强制关机,再次打开系统的时候,就提示这样fsck from util-linux 2.26.2 /dev/sda10 contains a file system with errors, check forced. /dev/sda10: Inodes that were part of a corrupted pr

芳草碧连天 2万+

替罪羊树详解

替罪羊树详解 刚开始学习平衡树。可是我太弱了弄不懂有旋转操作的treap和splay,这时候学习可以不用旋转操作——替罪羊树的平衡树就很适合。这个名字取得比较玄乎,一眼看上去并不知道有什么卵用,但是, 如果你是刚学平衡树的新手,那么从替罪羊树开始学一定是个绝佳的选择,因为它是个很优雅的平衡树,什么叫优雅?暴力即是优雅! 如果在一棵平衡的二叉搜索树内进行查询等操作,时间就可以稳定在log(n),但是...

zeng_jun_yv的博客 1081

华为OD机考双机位C卷 - AI处理器组合 (Java & Python & JS & GO & C++ & C)

> 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: [【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)](https://blog.youkuaiyun.com/banxia_frontend/article/details/155503868)

算法大师! 233

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 950

替罪羊树

\(Scapegoat Tree\)(替罪羊树) 网上许多题解都不是完整的替罪羊树 一个完整的替罪羊树还需做到以下两点 1、删除时需要对根节点进行过多cnt==0节点的判断 2、重构子树时没有及时更新父亲的cover值 来一发最为正确的实现了rankTree的替罪羊树题解 O2跑了151ms,不加优化也有250ms 无O2 | O2 还没完全实现常数优化 本人感觉好好背 替罪羊树原理以及实现前完...

weixin_30244681的博客 133

2025华为od机试真题B卷【停车场费用统计】Python实现

2025华为od机试真题B卷【停车场费用统计】Python实现

MISAYAONE的博客 538

替罪羊树[Scapegoat Tree]

前言 暴力即是优雅 —— 香sister 替罪羊树 如前言所说,替罪羊树是一种暴力优雅的数据结构。 作为一棵平衡树,替罪羊树和其他树都有着共同的使命:维护二叉查找树的平衡使得树高,即树上操作时间复杂度为O(log(n))O(log(n))O(log(n)) but,其他的平衡树(例如有旋Treap、AVL、Splay…),几乎都是用旋转操作维护树平衡的。而替罪羊树则是一种不需要旋转,而是采用一种更...

ICEEBBING的博客 572

在 SAP HANA 里为视图创建 Analytic Privilege,真正把同一份数据按角色切开

摘要:本文介绍了SAP HANA中基于业务角色的动态数据权限控制方法。通过Analytic Privilege技术,可以在同一视图上为不同角色设置不同的数据访问范围,实现行级安全控制。核心机制包括:1) 创建带有STRUCTURED PRIVILEGE CHECK的视图;2) 建立授权对象和用户映射表;3) 开发条件提供过程动态生成过滤条件;4) 创建结构化权限对象绑定条件提供器。这种设计使权限规则与业务数据解耦,便于维护变更,适合销售区域、财务数据等多角色访问控制场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2392

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

KD-Tree 学习小记+模板

Preface 听说KD树实在是个大神器 可以解决多维空间多维偏序点权和,可以求某个点的空间最近最远点 就二维平面上的来说,复杂度在O(nlog⁡n)O(n\log n)O(nlogn)到O(nn)O(n\sqrt n)O(nn​)不等 嫌KD树不平衡了还可以来一个替罪羊树式的暴力重构 再也不用担心写不出树套树了!(狗头) Text 这是个什么东西呢? 在一维数轴上,可以简单的比较两个值的大小,我...

Never give in. 346

RT-DETR训练前的准备,将数据集划分成训练集、测试集验证集(附完整脚本及使用说明)

在计算机视觉领域,当我们着手训练一个模型时,。其中,将数据集划分为和更是一项基础性且关键的操作。这篇博客分析了这一划分背后的原因、其重要意义以及如何通过代码实现,帮助大家更好地理解和运用这一技巧,。

Limiiiing的博客 906

【学习小记】KD-Tree

Preface 听说KD树实在是个大神器 可以解决多维空间多维偏序点权和,可以求某个点的空间最近最远点 就二维平面上的来说,复杂度在\(O(n\log n)\)到\(O(n\sqrt n)\)不等 嫌KD树不平衡了还可以来一个替罪羊树式的暴力重构 再也不用担心写不出树套树了!(狗头) Text 这是个什么东西呢? 在一维数轴上,可以简单的比较两个值的大小,我们就很容易将它们分治,建出一个二叉搜索树...

weixin_33896069的博客 133

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

暑假集训小记

Preface 一年一度的暑假又到来了,但是作为信竞学生当然是不存在放假这一说法的。 并且今年在大二中集训,经常有神仙讲课,而且中间还有机会出去玩交流学习(绍兴 or 义乌)。 总而言之还是很充实并且富有意义的。而且杨浩还给我免了一些作业 但提到作业,还是很坑的,语文 and 英语是一定要做的。还是挺狗的。而且我发现语文越不好好做作业就考得越好 关于这篇小记,可能就会简要记录一下每一天学...

weixin_30617737的博客 608

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

KD-tree 学习小记

考 \(NOI\) 时不会,感觉很亏。于是学了一上午,写了一晚上。 感觉这东西就是个复杂度玄学的高级暴力 (大雾 KD-tree 基本信息 \(D\) 就是 \(Dimension\) ,维度的意思。 \(KD-tree\) 就是用来解决多维点的问题。 它可以说是一棵平衡树,但建树时用来比较的东西很奇特。 查询几乎与线段树类似,但更暴力一些。每次查询的复杂度为 \(O(n^{\frac{k-1}{...

weixin_30559481的博客 127

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2018暑假绍兴集训小记(7.12~7.21)

前言 本次暑假的7.12~7.21,我们的信息团队到绍兴一中进行集训。这一次集训,让我感受到了绍一的强大(一道他们口中的EASY题却可以让我们想上一个甚至两三个小时)。不过,我也在这次集训中收获了许多。   Day1 7.12 今天主要是在学习图论。图论包含割边割点,强连通分量等各种玄学的内容。 图论与DP之间有着很大的联系,成环DP就是其中很难的一种。例如【POJ3028】Shoot-...

CXR的博客 1352

K-D tree学习小记(贴模板的)

K-D tree是一棵平衡二叉树。 K_D即K-Dimention,k维的意思。 可能维护什么k维偏序。 建树: 建树的过程中每次会把一堆点按照某一维切半,中间的提出来作根,分成两个部分作为左右子树继续建树。 一个比较劣的维度选法是循环选取,雨露均沾。 也可以随机钦点。 正统的K-D tree是选方差最大的那一维。 复杂度:O(k&amp;nbsp;n&amp;nbsp;log&amp;nbsp;n)O(k~n~log~...

Cold_Chair的博客 356

流浪者小记

  大概又一年的赛季真的结束了,然后是苹果和礼物,然后是埋葬旧年的钟声和新的开始。风以为的征程,是落叶的流浪。   因为是很重要的事情,因为是和珍视的朋友一起在做的这些事情,所以即使是流水账,也要记下来。   让懂的人懂,不懂的人不懂。翅膀长在你肩上啊,太过在意别人的眼光,你就飞不起来了。 — ICPC大连站 —   依旧碰上强气流,然后飞机安稳到了大连。   每次乘飞机总是...

weixin_30443075的博客 345

简析平衡树(一)——替罪羊树 Scapegoat Tree

前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构。不过,由于最近做的题目的题解中经常出现“平衡树”这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树。 简介 替罪羊树,英文名Scapegoat Tree,是我认为平衡树中最简单的一种。 替罪羊树的重构很暴力...

CXR的博客 7843

【替罪羊树及其应用】替罪羊树总结

替罪羊树是重量平衡树的一种,对于简单的平衡树应用,特别是维护的信息无法快速合并时,替罪羊树是个出色的选择。它的代码比较好理解,思想简单而暴力:对于一个节点,当左右子树的节点数量不平均时,我们就把它重构一遍。下面,我们重点阐述一下重构操作。 【基本操作】 1.拍扁重构操作: 当我们发现深度最浅的一个节点的子树不平衡时,我们从这个节点开始,对其子树进行中序遍历,同时用一个vector储存节点。代码中未...

weixin_44111457的博客 2048

数据结构:替罪羊树

替罪羊树作为平衡树家族里比较简单的一员,效率还是很不错的 只要不是维护序列之类的需要提取子树进行操作的问题,选择高效率的重量平衡树是无可非议的 我们可以用一个标准:需不需要采用旋转操作来对重量平衡树进行一个简单的分类: 没有采用旋转机制的有:跳表和替罪羊树 采用旋转机制的有:Treap 所有采用旋转机制的平衡树都有这么一个弊端:在平衡树的每个节点上维护一个集合,来存储子树内部所有的数,此...

weixin_30508241的博客 192

替罪羊树——简单粗暴的数据结构

前言 感谢 隐语的影法师 ,帮我找出了代码里的两个错误!真是让人没想到,之前的两个错误拼在一起居然过了模板题qwq 2019.11.18 update:更新了一些奇怪的东西qwq……(就是修了点锅 正题 这个名字取得比较玄乎,一眼看上去并不知道有什么卵用,但是, 如果你是刚学平衡树的新手,那么从替罪羊树开始学一定是个绝佳的选择,因为它是个很优雅的平...

a_forever_dream的博客 1万+

知识点整理:二叉(重量)平衡树——替罪羊树

知识点概要 知识点详解 平衡因子 子树的重构 基础操作 复杂度分析 关于替罪羊树 代码(luogu3369 &amp;amp;&amp;amp; BZOJ3224) 知识点概要 在各种二叉平衡树中,大多数的平衡树都是通过旋转来维护这棵二叉查找树的性质,并且尽量保证每次的查找的复杂度为logloglog的。然而说实话,各种情况的旋转很容易写挂,考场上一旦写挂掉就会心态爆炸,所以我们或许...

czl_233的博客 1128
上一篇: Codeforces 983E NN country
下一篇: bzoj2555: SubString
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值