普通平衡树Tyvj1728、luogu P3369 (splay)
存个模板,这次是splay的;
题目见这个题解: <--(鼠标移到这儿)
代码如下:
#include<cstdio>
#define INF 2147483647
using namespace std;
struct poo
{
int size,cnt,value;
int ch[],fa;
}data[];
int root,tot,x,n;
void insert();//插入v=x(x为全程量)的点//
void del();//删除v=x(x为全程量)的点//
int rank();//查找v=x(x为全程量)的点的排名 //
int find();//查找排名为x(x为全程量)的点 //
int las(int );//查找v=x(x为全程量)的点的前驱含splay//
int nex(int );//查找v=x(x为全程量)的点的后继含splay//
void splay(int );//含roll//
void roll(int );//含up//
int get_wh(int );//查找v=x(x为传参)的点的poo编号含splay//
int get(int );//查找poo=x(x为传参)的点的fa的相应儿子//
void cut(int );//切掉poo=x(x为传参)的点//
void make_data(int );//建立fa=f(f为传参)的点//
void up(int );//up poo=x(x为传参)的点//
void print(int );
void puttree(int ,int );
int main()
{
// freopen("input4.in","r",stdin);
// freopen("splay.out","w",stdout);
int i,j;
scanf("%d",&n);
root=;
for(i=;i<=n;i++){
scanf("%d%d",&j,&x);
switch(j){
case :insert();break;
case : del();break;
case : printf("%d\n",rank());break;
case : printf("%d\n",find());break;
case : insert();printf("%d\n", las(x));del();break;
case : insert();printf("%d\n", nex(x));del();break;
}
}
}
void insert(){
if(!root){
root=++tot;
make_data();
return;
}
int i=root,j=;
while(i){
if(data[i].value==x){
data[i].cnt++;data[i].size++;
splay(i);
return;
}
if(data[i].value>x)
j=i,i=data[i].ch[];
else
j=i,i=data[i].ch[];
}
int wh=data[j].value<x?:;
data[j].ch[wh]=++tot;
make_data(j);
splay(tot);
}
void del(){
int i,wh;
i=get_wh(x);
if(data[i].cnt>){
data[i].cnt--;data[i].size--;
return;
}
if(data[i].ch[]*data[i].ch[]==&&data[i].ch[]+data[i].ch[]!=){
wh=data[i].ch[]==?:;
root=data[i].ch[wh];
data[root].fa=;
cut(i);
return;
}
int old=root,pre=get_wh(las(data[root].value));
splay(pre);
data[data[old].ch[]].fa=root;data[root].ch[]=data[old].ch[];
cut(old);
up(root);
}
int rank(){
int now;
now=get_wh(x);
return data[data[now].ch[]].size+;
}
int find(){
int ans=root;
while(!(x>data[data[ans].ch[]].size&&x<=data[data[ans].ch[]].size+data[ans].cnt)){
if(x<=data[data[ans].ch[]].size)
ans=data[ans].ch[];
else{
x-=data[ans].size;
ans=data[ans].ch[];
x+=data[ans].size;
}
}
return data[ans].value;
}
int las(int x){
int i=get_wh(x);
i=data[i].ch[];
while(data[i].ch[])
i=data[i].ch[];
// splay(i);
return data[i].value;
}
int nex(int x){
int i=get_wh(x);
i=data[i].ch[];
while(data[i].ch[])
i=data[i].ch[];
// splay(i);
return data[i].value;
}
void splay(int now){
for(int fa=data[now].fa;fa=data[now].fa;roll(now))
if(data[fa].fa)
roll(get(now)==get(fa)?fa:now);
root=now;
}
void roll(int now){
int fa=data[now].fa,fafa=data[fa].fa,wh=get(now);
data[fa].ch[wh]=data[now].ch[wh^];data[data[fa].ch[wh]].fa=fa;
data[now].ch[wh^]=fa;data[fa].fa=now;
data[now].fa=fafa;
if (fafa)
data[fafa].ch[data[fafa].ch[]==fa]=now;
up(fa);up(now);
}
int get_wh(int x){
int i=root;
while(data[i].value!=x){
if(data[i].value>x)
i=data[i].ch[];
else
i=data[i].ch[];
}
splay(i);
return i;
}
int get(int x){
return data[data[x].fa].ch[]==x;
}
void cut(int x){
data[x].ch[]=data[x].ch[]=data[x].cnt=data[x].fa=data[x].size=data[x].value=;
}
void make_data(int f){
data[tot].fa=f;
data[tot].size=data[tot].cnt=;data[tot].value=x;
}
void up(int x){
data[x].size=data[data[x].ch[]].size+data[data[x].ch[]].size+data[x].cnt;
}
void print(int now){
if(!now)return;
print(data[now].ch[]);
printf("%d ",data[now].value);
print(data[now].ch[]);
}
//splay 17.2.20
//10
//1 5
//4 1
//1 6
//1 7
//1 10
//1 3
//1 4
//6 2
//1 8
//5 9
祝AC
普通平衡树Tyvj1728、luogu P3369 (splay)的更多相关文章
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- 【模板】普通平衡树(权值splay)
安利splay讲解: [洛谷日报第62期]Splay简易教程 [模板]普通平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下 ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...
- luogu P3369 【模板】普通平衡树(splay)
嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...
- 普通平衡树Tyvj1728、luogu P3369 (treap)
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的 ...
- fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : LibreOJ #104. 普通平衡树 #include <cstdio> #include <iostream> #include <algorithm ...
随机推荐
- centos7安装配置sql server 2017 linux教程
一.安装教程 https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker https://docs.mic ...
- Linux网络编程案例分析
本代码来自于博主:辉夜星辰 本篇主要对运行代码中出现的问题进行分析,代码本身的内容后续展开讨论. 服务器端代码 /* Linux网络编程之TCP编程,服务器端读数据 socket函数之后,返回值ser ...
- Prufer序列与树的计数(坑)
\(prufer\)序列: 无根树转\(prufer\)序列: 不断找编号最小的叶子节点,删掉并在序列中加入他相连的节点. \(prufer\)转无根树: 找到在目前\(prufer\)序列中未出现且 ...
- 最小生成树--牛客练习赛43-C
牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...
- springboot入门神器 -http://start.spring.io/(在线项目构建)
参考并直接引用:http://www.sousou.io/article/1506656459859 最近在学习spring boot,看的书是<JavaEE开发的颠覆者 Spring Boot ...
- PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()
代码在ubuntu下无缝运行OK 转到我的win7 64位 期间 学习机上 报错: Call to undefined function curl_init() 因为用到curl 远程抓取数据. 所以 ...
- [中英对照]Introduction to Remote Direct Memory Access (RDMA) | RDMA概述
前言: 什么是RDMA? 简单来说,RDMA就是指不通过操作系统(OS)内核以及TCP/IP协议栈在网络上传输数据,因此延迟(latency)非常低,CPU消耗非常少. 下面给出一篇简单介绍RDMA的 ...
- 如果天空不死博客java阅读列表整理
如果天空不死的主页https://home.cnblogs.com/u/skywang12345 下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01 ...
- WordNet::Similarity的安装和使用
简介 WordNet::Similarity是一个Perl实现的软件包,可以用来计算两个概念(或者word sense)之间的语义相似度,它提供了六种计算相似度和三种计算概念之间关联度的方法,所有的这 ...
- centos下对文件某些特定字符串分组统计出现次数
假如现有数据: { "@timestamp": "2018-10-13T21:55:58+08:00", "remote_addr": &q ...