替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树
冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ)。
先是打了一下想学好久的替罪羊树。
替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树。
调试小结:
1.删除操作分两类情况:如果某点只有一个孩子,将它的孩子提上来即可,否则将它变为它的前驱,再删去它的前驱。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const double a=0.75;
inline int getnum()
{
int ans=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh*=-;ch=getchar();}
while(ch>=''&&ch<='')ans=ans*+ch-'',ch=getchar();
return fh*ans;
}
struct node{int s[],f,size,num;}t[];int tnum,root;
inline void init()
{
tnum=;root=;
t[].num=-;t[].size=;t[].s[]=;
t[].num=;t[].size=;t[].f=;
}
inline bool balance(int po)
{
return (double)t[po].size*a>=(double)t[t[po].s[]].size
&&(double)t[po].size*a>=(double)t[t[po].s[]].size;
}
int E[],esize;
void travel(int po)
{
if(t[po].s[])travel(t[po].s[]);
E[++esize]=po;
if(t[po].s[])travel(t[po].s[]);
}
int build(int l,int r)
{
if(l>r)return ;
int mid=(l+r)/,po=E[mid];
t[t[po].s[]=build(l,mid-)].f=po;
t[t[po].s[]=build(mid+,r)].f=po;
t[po].size=t[t[po].s[]].size+t[t[po].s[]].size+;
return po;
}
inline void rebuild(int po)
{
esize=;travel(po);
int fa=t[po].f,ws=(t[t[po].f].s[]==po);
int npo=build(,esize);
t[t[fa].s[ws]=npo].f=fa;
if(po==root)root=npo;
}
inline void insert(int num)
{
int now=root,npo=++tnum;
t[npo].size=;t[npo].num=num;
while(true)
{
t[now].size++;
bool ws=(num>=t[now].num);
if(t[now].s[ws])now=t[now].s[ws];
else {t[t[now].s[ws]=npo].f=now;break ;}
}
int inv=;
for(int i=npo;i;i=t[i].f)if(!balance(i))inv=i;
if(inv)rebuild(inv);
}
inline int rank(int num)
{
int now=root,ans=;
while(now)
{
if(t[now].num<num)ans+=t[t[now].s[]].size+,now=t[now].s[];
else now=t[now].s[];
}
return ans;
}
inline int getkth(int kth)
{
int now=root;
while(true)
{
if(t[t[now].s[]].size==kth-)return now;
else if(t[t[now].s[]].size>=kth)now=t[now].s[];
else kth-=t[t[now].s[]].size+,now=t[now].s[];
}
return now;
}
inline int getn(int num)
{
int now=root;
while(true)
{
if(t[now].num==num)return now;
else now=t[now].s[t[now].num<num];
}
}
inline void erase(int po)
{
if(t[po].s[]&&t[po].s[])
{
int tpo=t[po].s[];
while(t[tpo].s[])tpo=t[tpo].s[];
t[po].num=t[tpo].num;
po=tpo;
}
int son=(t[po].s[])?t[po].s[]:t[po].s[],ws=(t[t[po].f].s[]==po);
t[t[t[po].f].s[ws]=son].f=t[po].f;
for(int i=t[po].f;i;i=t[i].f)t[i].size--;
if(po==root)root=son;
}
inline int succ(int num)
{
int now=root,ans=;
while(now)
{
if(t[now].num>num)ans=min(ans,t[now].num),now=t[now].s[];
else now=t[now].s[];
}
return ans;
}
inline int pred(int num)
{
int now=root,ans=-;
while(now)
{
if(t[now].num<num)ans=max(ans,t[now].num),now=t[now].s[];
else now=t[now].s[];
}
return ans;
}
int main(int argc, char *argv[])
{
init();
int n=getnum();
for(int i=;i<=n;i++)
{
int p=getnum(),num=getnum();
if(p==)insert(num);
if(p==)erase(getn(num));
if(p==)printf("%d\n",rank(num));
if(p==)printf("%d\n",t[getkth(num+)].num);
if(p==)printf("%d\n",pred(num));
if(p==)printf("%d\n",succ(num));
}
return ;
}
替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树的更多相关文章
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
随机推荐
- AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器
AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...
- 【前端开发系列】—— CSS3属性选择器总结
想想自己为什么要学CSS,作为一个开发过前端的人员来说,调试一个图片花了半天的时间,最后发现分隔符用错了,实在是一件很丢人的事情.因此,痛下决心来学习CSS,最近一周也会更新下相关的学习笔记. CSS ...
- 英语etc怎么发音、单词来历
etc是等等的意思,与and so on 相同 音标/et'set(a)ra/ 源于法语et cetera,也是等等的意思 在计算机操作系统目录(linux和windows)有一个叫etc的目录 里面 ...
- 四则运算 Day3
总结篇 一开始看到自己的成绩是接近及格线的时候,我的内心是崩溃的,就差辣么一点点..但是感谢老师给了这么一个补交作业的机会.在参考博客园相关四则运算题目后,做了一个适用小学一二年级使用的简单的四则运算 ...
- java操作xml
package com.xml.zh; import javax.xml.parsers.*; import org.w3c.dom.*; public class XmlTest1{ /** * 使 ...
- C语言结构体的初始化
今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; ...
- 【SDOI2008】解题汇总
好叭我真的是闲的了... /---------------------------------------------/ BZOJ-2037 [SDOI2008]Sue的小球 DP+相关费用提前计算 ...
- jboss7.1.1配置mysql数据源
http://blog.csdn.net/msz1992/article/details/8826754 #1.到http://www.mysql.com/downloads/connector/j/ ...
- bootstrap学习总结-06 按钮
一按钮的基本样式 Bootstrap提供一组标准的按钮配色和大小调整方案,只需要简单的应用的按钮类即可.BootStrap3提供了按钮的标准样式如图. <!DOCTYPE html> &l ...
- html5+ 获取当前设备的加速度信息
getCurrentAcceleration 获取当前设备的加速度信息 void plus.accelerometer.getCurrentAcceleration( successCB, error ...