普通平衡树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 ...
随机推荐
- 8102 年的现代 Web 开发最佳实践(笑)
简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...
- delphi 10.2---非常简单的数组用法求和
unit Unit9; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- P3698 [CQOI2017]小Q的棋盘
题目链接 题意分析 首先 我们肯定会贪心的走从根节点到叶子结点最长的一条链 首先没有过剩的就好办了 但是有的话 我们就一边往下走 一边走分支 分支上每一个点平均走过两次 所以我们把剩下的除以\(2\) ...
- 关于类的成员,public,private修饰符
类的成员要:属性,方法 属性:是它本身所居有的东西,比如人的特征,也可以这样理解属性是静态状态 方法:是这些属性通过方法行为发生改变,也就是方法是动态,可以对属性进行更新 public 公共的,可以被 ...
- 哈弗曼树的理解和实现(Java)
哈弗曼树概述 哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途.哈弗曼树的定义,涉及路径.路径长度.权等概念.哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等. 哈弗曼树的一些定 ...
- 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I
1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...
- Machine learning第四周code 编程作业
1.lrCostFunction: 和第三周的那个一样的: function [J, grad] = lrCostFunction(theta, X, y, lambda) %LRCOSTFUNCTI ...
- js 移动端获取当前用户的经纬度
一.HTML5 geolocation的属性 if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(onSuccess ...
- Java线程池的选择
在java的concurrent.Executors主要提供两种线程池:无固定线程数但有限制任务队列的cachedThreadPool与有固定线程数但无任务队列限制的fixedThreadPool,这 ...
- 'qt_sql_default_connection' is still in use
出现这个告警是因为打开了多个db而没有及时关闭,网上搜了答案是使用完了执行 QSqlDatabase::removeDatabase(m_connectionName); 泄漏的问题有所改善,但点快了 ...