冬令营被平衡树坑了之后,打算苦练一番数据结构(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 普通平衡树的更多相关文章

  1. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  2. bzoj3224: Tyvj 1728 普通平衡树(平衡树)

    bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...

  3. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5354  Solved: 2196[Submit][Sta ...

  4. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  5. 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树

    一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...

  6. BZOJ3224 Tyvj 1728 普通平衡树(Treap)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. 【权值分块】bzoj3224 Tyvj 1728 普通平衡树

    权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...

  8. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

  9. [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

随机推荐

  1. Linq之常见关键字

    目录 写在前面 系列文章 常见关键字 总结 写在前面 前面的几篇文章算是对linq的铺垫,从本篇开始将进行linq的语法及实践. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda ...

  2. 第二十一课:js属性操作的兼容性问题

    上一课主要讲了属性的概念,用法,固有属性和自定义属性的区别,class属性操作的方法等,这一课主要讲一些有关属性操作的兼容性问题. IE6-IE8在一些表示URL的属性会返回补全的改过编码的路径,比如 ...

  3. Java-小数点控制

    package 运算及类型转换类; import java.text.DecimalFormat; public class 控制小数点类 { public static double decimal ...

  4. Java基础-设计模式之-代理模式Proxy

    代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...

  5. BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)

    污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...

  6. MyEclipse10中导入的jquery文件报错(出现红叉叉,提示语法错误)

    为了做一个页面特效,导入了一个jQuery文件,怎想,myeclipse竟然报错说是语法错误,但是这个js文件我是从官网上下载的,不应该出错才对,百度谷歌之后终于找到了解决办法: 选中报错的js文件, ...

  7. 【poj3348】 Cows

    http://poj.org/problem?id=3348 (题目链接) 题意 给出平面上n个点,以这n个点中的一些围成的多边形面积 div 50的最大值. Solution 凸包求面积. 很好做, ...

  8. Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux

    目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...

  9. 拉面馆中的移动互联网——无线KPI探讨

    拉面馆中的移动互联网——无线KPI探讨 伴随着这几年超高速发展,移动互联网早已经度过了小米加步枪的散兵游击状态,随着各大公司持重金杀入,无线从几个人的Team,到快速发展为几十.上百人甚至上千人的大部 ...

  10. leach协议matlab仿真代码

    http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議clear;%清除內存變量 xm=100;%x軸範圍ym=100;%y軸範圍 sink. ...