bzoj3224 普通平衡树【splay版】

2023-11-07 21:38
文章标签 平衡 splay 普通 bzoj3224

本文主要是介绍bzoj3224 普通平衡树【splay版】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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每行输出一个数,表示对应答案




二叉平衡树模板题,splay版。

treap版见http://blog.csdn.net/sdfzyhx/article/details/51418974。

替罪羊树版见http://blog.csdn.Net/sdfzyhx/article/details/70212142。



#include<cstdio>
#include<cstring>
struct node
{int f,c[2],x,size,cnt;
}t[100010];
int root,size;
void up(int p)
{t[p].size=t[t[p].c[0]].size+t[t[p].c[1]].size+t[p].cnt;
}
void rot(int p,bool b)
{int x=t[p].f;int y=t[p].c[b];int z=t[y].c[!b];t[x].c[t[x].c[0]!=p]=y;if (y)t[y].f=x;t[y].c[!b]=p;if (p)t[p].f=y;t[p].c[b]=z;if (z)t[z].f=p;up(p);up(y);
}
void splay(int p)
{int x=t[p].f;int y=t[x].f;if (!x) return;if (!y){rot(x,t[x].c[0]!=p);return;}if ((t[x].c[0]==p)^(t[y].c[0]==x))rot(x,t[x].c[0]!=p),rot(y,t[y].c[0]!=p),splay(p);elserot(y,t[y].c[0]!=x),rot(x,t[x].c[0]!=p),splay(p);
}
void ins(int p,int x,int f,bool b)
{if (p==0){p=++size;t[f].c[b]=p;t[p].f=f;t[p].x=x;t[p].size=t[p].cnt=1;splay(p);return;}t[p].size++;if (t[p].x==x){t[p].cnt++;splay(p);return;}ins(t[p].c[x>t[p].x],x,p,x>t[p].x);
}
void del(int p,int x,int f,int b)
{if (t[p].x==x){if (t[p].cnt>1){t[p].size--;t[p].cnt--;return;}if (t[p].c[0]==0&&t[p].c[1]==0){t[f].c[b]=0;return;}if (t[p].c[0]*t[p].c[1]==0){t[f].c[b]=t[p].c[0]+t[p].c[1];if (t[p].c[0])t[t[p].c[0]].f=f;elset[t[p].c[1]].f=f;return;}rot(p,t[t[p].c[1]].size<t[t[p].c[0]].size);t[t[p].f].size--;del(p,x,t[p].f,t[t[p].f].c[0]!=p);return;}t[p].size--;del(t[p].c[x>t[p].x],x,p,x>t[p].x);
}
int ran(int p,int x)
{if (p==0) return 0;if (x<t[p].x) return ran(t[p].c[0],x);if (x==t[p].x){int ans=t[t[p].c[0]].size+1;splay(p);return ans;}return t[t[p].c[0]].size+t[p].cnt+ran(t[p].c[1],x);
}
int que(int p,int x)
{if (p==0) return 0;if (x<=t[t[p].c[0]].size) return que(t[p].c[0],x);if (x<=t[t[p].c[0]].size+t[p].cnt){splay(p);return t[p].x;}return que(t[p].c[1],x-t[t[p].c[0]].size-t[p].cnt);
}
int pre(int p,int x)
{if (p==0) return -1;if (t[p].x<x){int y=pre(t[p].c[1],x);if (y==-1){splay(p);return t[p].x;}return y;}return pre(t[p].c[0],x);
}
int suc(int p,int x)
{if (p==0) return -1;if (t[p].x>x){int y=suc(t[p].c[0],x);if (y==-1){splay(p);return t[p].x;}return y;}return suc(t[p].c[1],x);
}
int main()
{int i,j,k,x,y,n;scanf("%d",&n);for (i=1;i<=n;i++){scanf("%d%d",&x,&y);if (x==1) ins(t[0].c[0],y,0,0);if (x==2) del(t[0].c[0],y,0,0);if (x==3) printf("%d\n",ran(t[0].c[0],y));if (x==4) printf("%d\n",que(t[0].c[0],y));if (x==5) printf("%d\n",pre(t[0].c[0],y));if (x==6) printf("%d\n",suc(t[0].c[0],y));}
}


这篇关于bzoj3224 普通平衡树【splay版】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366412

相关文章

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

箭头函数跟普通函数的区别

箭头函数(Arrow Function)和普通函数(Function Declaration/Expression)在 JavaScript 中有一些重要的区别,主要体现在以下几个方面: 1. 语法 箭头函数: 语法更简洁,没有 function 关键字。 对于单一表达式函数,结果会隐式返回,不需要 return 关键字。 不需要使用大括号 {},但如果使用,必须显式返回值。 示例:

热泵专用压缩机与普通压缩机的区别

普通压缩机和低温压缩机在空气源热泵机组上应用对比: 1.普通压缩机 1.低温工况运行时,压缩机高压缩比、产生过热、润滑油变质、涡旋盘磨损等;高温工况运行时,电机过载、轴承磨损、电机绕组超过极限。 2.高水温运行时,高冷凝温度,电机过载、过热;润滑油变质,涡旋盘磨损、轴承磨损,电机绕组超过极限。 3.在低温工况时,能力不够和能效比低,经济性差,在-10度以下能力衰减可达40%以上,COP<1.5W/

写给大数据开发:你真的“慢“了吗?揭秘技术与职场的平衡艺术

你是否曾经在深夜里,面对着一个棘手的数据处理问题,感到无比沮丧?或者在一次重要的项目汇报中,突然语塞,无法清晰地表达你的技术方案?作为一名大数据开发者,这些场景可能再熟悉不过。但别担心,因为你并不孤单。让我们一起探讨如何在这个瞬息万变的行业中,既磨练技术利刃,又培养职场软实力。 目录 技术与时间的赛跑1. 长远视角的重要性2. 复利效应在技能学习中的应用 跨界思维:数据结构教我们的职场智

代码随想录 -- 二叉树 -- 平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode) 思路:仍然是递归调用 1. 定义一个递归函数 count 用来计算二叉树的层数 2. isBalanced 函数:如果传入根节点为空返回真;如果根节点 | 左子树的层数 - 右子树的层数 | 大于1,返回假;最后返回根节点左子树、右子树是否是平衡二叉树。 class Solution(object):def count(self,root

构建STM32智能平衡车项目:PID控制算法与蓝牙通信技术

一、项目概述 项目目标和用途 本项目旨在设计和实现一款基于STM32单片机的平衡车。平衡车是一种新型的个人交通工具,广泛应用于短途出行、休闲娱乐等场景。通过本项目,我们希望能够实现一款具备良好稳定性和操控性的平衡车,能够在不同的地形上自如行驶。 解决的问题和带来的价值 平衡车的核心问题在于如何保持其平衡。传统的平衡车往往依赖于复杂的控制算法和高精度的传感器。通过本项目,我们将利用STM32

二叉搜索树、平衡二叉树、B树、B+树、B*树

二叉查找树 二叉查找树,由于不平衡,如果连续插入的数据是有顺序的、会导致如下图B的所示,此时搜索会退化到O(N)   二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任

JS中【普通函数中的this】vs【箭头函数中的this】

在 JavaScript 中,this 关键字是一个非常重要的概念,它通常指向函数执行时的上下文对象。然而,箭头函数(arrow functions)中的 this 行为与普通函数不同,它的 this 是在函数定义时绑定的,并且无法通过调用方式或其他方式改变。下面将详细解释这一概念。 1. 普通函数中的 this 首先,了解普通函数中的 this 是如何工作的。 1.1 全局上下文中的 th

Splay树(区间更新)—— POJ 3468 A Simple Problem with Integers

对应POJ 题目:点击打开链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 72765 Accepted: 22465Case Time Limit: 2000MS Description You have N integers, A1