【bzoj3224】普通平衡树——treap

我的第一道treap题目,treap的模版题。

代码是对着hzw的敲的,一边敲一边理解。。。

主要是熟悉一下treap的各种基本操作,详细细节看代码。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
struct point
{int l,r,v,rnd,size,w;
}tree[100005];
int n,size=0,root=0,ans;
void update(int k)
{tree[k].size=tree[tree[k].l].size+tree[tree[k].r].size+tree[k].w;
}
void rturn(int &t)
{int k=tree[t].l;tree[t].l=tree[k].r;tree[k].r=t;tree[k].size=tree[t].size;update(t);t=k;
}
void lturn(int &t)
{int k=tree[t].r;tree[t].r=tree[k].l;tree[k].l=t;tree[k].size=tree[t].size;update(t);t=k;
}
void insert(int &k,int x)
{if(k==0){size++;k=size;tree[k].size=tree[k].w=1;tree[k].v=x;tree[k].rnd=rand();return;}tree[k].size++;if(tree[k].v==x)tree[k].w++;else if(x>tree[k].v){insert(tree[k].r,x);if(tree[tree[k].r].rnd<tree[k].rnd)lturn(k);}else {insert(tree[k].l,x);if(tree[tree[k].l].rnd<tree[k].rnd)rturn(k);}
}
void del(int &k,int x)
{if(k==0)return ;if(tree[k].v==x){if(tree[k].w>1){tree[k].w--;tree[k].size--;return;}if(tree[k].l*tree[k].r==0)k=tree[k].l+tree[k].r;else if(tree[tree[k].l].rnd<tree[tree[k].r].rnd)rturn(k),del(k,x);else lturn(k),del(k,x);}else if(x>tree[k].v)tree[k].size--,del(tree[k].r,x);else tree[k].size--,del(tree[k].l,x);
}
int get_rank(int k,int x)
{if(k==0)return 0;if(tree[k].v==x)return tree[tree[k].l].size+1;else if(tree[k].v<x)return tree[tree[k].l].size+tree[k].w+get_rank(tree[k].r,x);else return get_rank(tree[k].l,x);
}
int get_x(int k,int x)
{if(k==0)return 0;if(x<=tree[tree[k].l].size)return get_x(tree[k].l,x);else if(x>tree[tree[k].l].size+tree[k].w)return get_x(tree[k].r,x-tree[tree[k].l].size-tree[k].w);else return tree[k].v;
}
void get_big(int k,int x)
{if(k==0)return;if(tree[k].v<x){ans=k;get_big(tree[k].r,x);}else get_big(tree[k].l,x);
}
void get_small(int k,int x)
{if(k==0)return ;if(tree[k].v>x){ans=k;get_small(tree[k].l,x);}else get_small(tree[k].r,x);
}
int main()
{scanf("%d",&n);int opt,x;for(int i=1;i<=n;i++){scanf("%d %d",&opt,&x);switch(opt){case 1:insert(root,x);break;case 2:del(root,x);break;case 3:printf("%d\n",get_rank(root,x));break;case 4:printf("%d\n",get_x(root,x));break;case 5:ans=0;get_big(root,x);printf("%d\n",tree[ans].v);break;case 6:ans=0;get_small(root,x);printf("%d\n",tree[ans].v);break;}}return 0;
}

万分感谢黄学长啊啊啊啊

转载于:https://www.cnblogs.com/JKAI/p/6935265.html

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

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

相关文章

md5加密 兼容.netcore5

md5加密 支持.netcore5 using System; using System.Security.Cryptography; namespace MyApp.HelloWorld {class Program{static void Main(string[] args){Console.WriteLine(MD5Encrypt("123456"));Console.WriteLine("Hello World!");}/// <su…

【转载】安卓开发者在使用deepin15.4时可能会遇到的问题

本文转载自&#xff1a;https://bbs.deepin.org/forum.php?modviewthread&tid138244&extra 1、在你安装好Android Studio前别忘了先安装default-jdk2、终端提示&#xff1a;Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettingsgasp 解决方法&#xff1a…

.net core linux安装

手动安装 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-scripted-manual#manual-install 进入.net core 5.0 https://dotnet.microsoft.com/download/dotnet/5.0 再点击linux x64版本下载 https://download.visualstudio.microsoft.com/download/pr/7f736160-…

【转】java提高篇(二)-----理解java的三大特性之继承

【转】java提高篇(二)-----理解java的三大特性之继承 原文地址&#xff1a;http://www.cnblogs.com/chenssy/p/3354884.html 在《Think in java》中有这样一句话&#xff1a;复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言&#xff0c;仅仅能够复制代码并对…

google AviatorEvaluator 变量公式计算

添加依赖 <dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.2.0</version> </dependency>编写代码 import com.googlecode.aviator.AviatorEvaluator; import com.google…

免费生成https证书以及配置

http升级到https需要在nginx的配置中加入证书信息,查询资料后确定生成证书两种方案第一种:自签名证书,然后开启 CloudFlare 的 CDN 服务 //确定是否安装opensslwhich openssl//如果没有安装,通过apt-get或者yum等方式安装即可sudo apt-get install openssl//生成一个名为“ssl.…

redis 4.0.9 centos7 双机集群安装

开启limits限制 sudo bash -c cat >> /etc/security/limits.conf <<-EOF * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072EOFreboot重启 安装redis 两台机器都运行 yum install -y wget gcc wget http://download.redis.io/…

关于毕业的一些事情

这篇日志&#xff0c;算是日记吧。就当做日记。 今天上午8点開始在8-302举行答辩&#xff0c;关于毕业论文&#xff0c;就是用的原先的智能问答机器人。也还算顺利。无论咋样&#xff0c;过是没问题。 晚上在校园食代举行班级谢师宴&#xff0c;老师来了15位左右&#xff0c;跟…

递归树思路总结思考

递归思路 传入数组 传入单个对象 传入数组 内部先遍历进行单个对象处理&#xff0c; 再递归单个对象的children 传入对象 内部先处理当前对象&#xff0c;再遍历对象children&#xff0c;对每个children进行递归调用。 需要处理返回值的情况 一种是传入对象指针&#xff…

前端学习(2441):删除处理完成

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

5、用枚举值表示状态、选项、状态码

一、C语言中1、C语言中的枚举类型enum。在以一系列常量来表示错误状态码或可组合的选项时&#xff0c;极宜使用枚举为其命名。2、定义一个enumenum personAgeState { personAgeStateLitter,personAgeStateBigger};property (nonatomic, assign) enum personAgeState personAge;…

openjdk17体验

jdk17是继jdk8和jdk11之后的LTS版本&#xff0c;该版本支持到2029年12月&#xff0c;下载地址 https://jdk.java.net/17/ 我是ubuntu64位环境&#xff0c;下载linux/x64版本&#xff0c;解压 打开idea创建一个新项目&#xff0c;添加jdk17并设置为jdk17 写个helloworld packa…

linux zip分卷压缩解压命令

linux下有时因为文件过大&#xff0c;传输过程中需要将源文件压缩为多个zip文件&#xff0c;以下是具体方法 压缩 zip -r -s 1g split.zip fold/ -s 1g代表分卷大小 split.zip为压缩包名 fold/为待压缩的目录 解压 zip -s 0 split.zip --out unsplit.zip unzip unslit.zip…

不确定屏幕大小的弹窗垂直居中(用了box方法)

对于父元素高度不确定&#xff0c;又要实现上下左右对齐&#xff0c;只需要在弹窗的父元素上使用box布局&#xff0c;控制弹窗上下左右居中 <div class"pop_wrap"><div class"pop"></div> </div> .pop_wrap{display:-webkit-box;-…