(其实今天好热啊?

  题目大意:插入,删除,k小,前驱后继,数的排名。

  splay和treap裸题...过几天补个treap的

splay:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define which(x) (son[fa[x]][1]==x)
using namespace std;
const int extar[]={,-};
int fa[],count[],son[][],val[],data[];
int root,x,y,n,tot,xiugai;
void read(int &k)
{
k=;int f=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void rotate(int x)
{
int f=fa[x];
bool k=which(x);
son[f][k]=son[x][!k];son[x][!k]=f;son[fa[f]][which(f)]=x;
if(son[f][k])fa[son[f][k]]=f;fa[x]=fa[f];fa[f]=x;
count[x]=count[f];
count[f]=count[son[f][]]+count[son[f][]]+val[f];
}
void splay(int x,int g)
{
while(fa[x]!=g)
{
int f=fa[x];
if(fa[f]==g)
{
rotate(x);
break;
}
if(which(x)^which(f))rotate(x);
else rotate(f);
rotate(x);
}
if(!g)root=x;
}
int search(int x,int y)
{
if(data[x]>y&&son[x][])return search(son[x][],y);
if(data[x]<y&&son[x][])return search(son[x][],y);
return x;
}
int ext(int x,int w)
{
int k=search(x,extar[w]);
splay(k,);
return data[k];
}
int pred(int w)
{
int k=search(root,w);
splay(k,);
if(data[k]<w)return data[k];
return ext(son[k][],);
}
int succ(int x)
{
int k=search(root,x);
splay(k,);
if(data[k]>x)return data[k];
return ext(son[k][],);
}
int rank(int x,int k)
{
if(k<=count[son[x][]])return rank(son[x][],k);
if(k<=(count[son[x][]]+val[x]))return x;
return rank(son[x][],k-count[son[x][]]-val[x]);
}
int findnum(int x)
{
int k=search(root,x);
splay(k,);
return count[son[k][]]+;
}
void insert(int &x,int w,int f)
{
if(!x)
{
x=++tot;
count[x]=val[x]=;
data[x]=w;
fa[x]=f;
xiugai=tot;
return;
}
if(data[x]==w)val[x]++,xiugai=x;
if(data[x]<w)insert(son[x][],w,x);
if(data[x]>w)insert(son[x][],w,x);
count[x]++;
}
void del(int w)
{
int k=search(root,w);
splay(k,);
if(data[k]==w)
{
if(val[k]>)val[k]--,count[k]--;
else
if(!son[k][])
{
root=son[k][];
fa[root]=fa[k]=son[k][]=count[k]=val[k]=data[k]=;
}
else
{
fa[son[k][]]=;ext(son[k][],);
son[root][]=son[k][];
if(son[k][])fa[son[k][]]=root;
count[root]+=count[son[k][]];
fa[k]=son[k][]=son[k][]=data[k]=val[k]=count[k]=;
}
}
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
read(x);read(y);
switch(x)
{
case :insert(root,y,);splay(xiugai,);root=xiugai;break;
case :del(y);break;
case :printf("%d\n",findnum(y));break;
case :printf("%d\n",data[rank(root,y)]);break;
case :printf("%d\n",pred(y));break;
case :printf("%d\n",succ(y));break;
default:break;
}
}
}

bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【Splay】bzoj3224 Tyvj 1728 普通平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

  7. [bzoj3224]Tyvj 1728 普通平衡树——splay模板

    题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...

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

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

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

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

随机推荐

  1. Linux命令应用大词典-第6章 文件处理

    6.1 sort:对文件中的数据进行排序 6.2 uniq:将重复行从输出文件中删除 6.3 cut:从文件每行中输出选定的字节.字符或字段 6.4 comm:逐行比较两个已经排序的文件 6.5 di ...

  2. 【swiper】 滑块组件说明

    swiper 滑块视图容器,其原型如下: <swiper indicator-dots="[Boolean]" indicator-color="[Color]&q ...

  3. MD5接口解密操作_接口签名校验

    很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密如以下POST接口 http://localhost:8080/pinter/com/userInfo 参数为{"phoneNum ...

  4. gitignore 文件生效办法

    .gitignore 可以添加一些不加入git版本控制的文件 比如一些测试文件.因人而异的配置信息等等 .gitignore 文件展示如下 /.idea/target//.classpath /.pr ...

  5. Visaul Studio 密钥

    vs professional 2015 简体中文版  :HMGNV-WCYXV-X7G9W-YCX63-B98R2

  6. 出现java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.web.visit.main.ClickVist$VisitMapper.<init>()的问题

    执行mapreduce报错java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.w ...

  7. 【RL系列】Multi-Armed Bandit笔记——UCB策略与Gradient策略

    本篇主要是为了记录UCB策略与Gradient策略在解决Multi-Armed Bandit问题时的实现方法,涉及理论部分较少,所以请先阅读Reinforcement Learning: An Int ...

  8. 动态内存&对象

    一.对象的生存期 对于 static 对象和自动对象,它们都有着严格定义的生存期. 全局对象:在程序启动时分配,在程序结束时销毁. 局部自动对象:在对象定义语句时分配,在离开块时销毁 局部 stati ...

  9. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  10. Java之I/O流(第2部分)

    1. 节点类类型: 2. 访问文件: Demo_1: import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...