Splay的初步学习
具体是啥,qwq
有时间再补吧,贴一下代码;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstring>
#define MAXN 10086666
using namespace std;
int f[MAXN],cnt[MAXN],value[MAXN];
int sons[MAXN][],sub_size[MAXN];
int root,whole_size;
int m,num,be_dealt;
inline int read()
{
int x = ;
int f = ;
char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-')
f = -;
ch = getchar();
}
while(isdigit(ch))
{
x = x * + ch - ;
ch = getchar();
}
return x * f;
}
inline void S_clear(int x)
{
sons[x][] = sons[x][] = ;
f[x] = cnt[x] = value[x] = ;
sub_size[x] = ;
}
inline bool get_which(int x)
{
return sons[f[x]][] == x;
}
inline void update(int x)
{
if(x)
{
sub_size[x] = cnt[x];
if(sons[x][])
sub_size[x] += sub_size[sons[x][]];
if(sons[x][])
sub_size[x] += sub_size[sons[x][]];
}
return ;
}
inline void rotate(int x)
{
int father = f[x];
int g_father = f[father];
int which_son = get_which(x);
sons[father][which_son] = sons[x][which_son ^ ];
f[sons[father][which_son]] = father;
sons[x][which_son ^ ] = father;
f[father] = x;
f[x] = g_father;
if(g_father)
sons[g_father][sons[g_father][] == father] = x;
update(father);
update(x);
}
inline void splay(int x)
{
for(int fa;fa = f[x];rotate(x))
if(f[fa])
rotate((get_which(x)) == get_which(fa) ? fa : x);
root = x;
}
inline void insert(int x)
{
if(!root)
{
whole_size++;
sons[whole_size][] = sons[whole_size][] = f[whole_size] = ;
root = whole_size;
sub_size[whole_size] = cnt[whole_size]++;
value[whole_size] = x;
return ;
}
int now = root;
int fa = ;
while()
{
if(x == value[now])
{
cnt[now]++;
update(now);
update(fa);
splay(now);
break;
}
fa = now;
now = sons[now][value[now] < x];
if(!now)
{
whole_size++;
sons[whole_size][] = sons[whole_size][] = ;
f[whole_size] = fa;
sub_size[whole_size] = cnt[whole_size] = ;
sons[fa][value[fa] < x] = whole_size;
value[whole_size] = x;
update(fa);
splay(whole_size);
break;
}
}
}
inline int find_sum(int x)
{
int now = root;
while()
{
if(sons[now][] && x <= sub_size[sons[now][]])
now = sons[now][];
else
{
int temp = (sons[now][] ? sub_size[sons[now][]] : ) + cnt[now];
if(x <= temp)
return value[now];
x -= temp;
now = sons[now][];
}
}
}
inline int find_num(int x)
{
int now = root;
while()
{
if(sons[now][] && x <= sub_size[sons[now][]])
now = sons[now][];
else
{
int temp = (sons[now][] ? sub_size[sons[now][]] : ) + cnt[now];
if(x <= temp)
return value[now];
x -= temp;
now = sons[now][];
}
}
}
inline int find_rank(int x)
{
int now = root;
int ans = ;
while()
{
if(x < value[now])
now = sons[now][];
else
{
ans += (sons[now][] ? sub_size[sons[now][]] : );
if(x >= value[now])
{
splay(now);
return ans + ;
}
ans += cnt[now];
now = sons[now][];
}
}
}
inline int find_pre()
{
int now = sons[root][];
while(sons[now][])
now = sons[now][];
return now;
}
inline int find_suffix()
{
int now = sons[root][];
while(sons[now][])
now = sons[now][];
return now;
}
inline void my_delete(int x)
{
int kkk = find_rank(x);
if(cnt[root] > )
{
cnt[root]--;
update(root);
return ;
}
if(!sons[root][] && !sons[root][])
{
S_clear(root);
root = ;
return ;
}
if(!sons[root][])
{
int old_root = root;
root = sons[root][];
f[root] = ;
S_clear(old_root);
return ;
}
else
if(!sons[root][])
{
int old_root = root;
root = sons[root][];
f[root] = ;
S_clear(old_root);
return ;
}
int left_max = find_pre();
int old_root = root;
splay(left_max);
sons[root][] = sons[old_root][];
f[sons[old_root][]] = root;
S_clear(old_root);
update(root);
}
int main()
{
scanf("%d",&m);
for(int i=;i<=m;i++)
{
num = read();
be_dealt = read();
switch(num)
{
case : insert(be_dealt);break;
case : my_delete(be_dealt);break;
case : printf("%d\n",find_rank(be_dealt));break;
case : printf("%d\n",find_num(be_dealt));break;
case : insert(be_dealt);printf("%d\n",value[find_pre()]);my_delete(be_dealt);break;
case : insert(be_dealt);printf("%d\n",value[find_suffix()]);my_delete(be_dealt);break;
}
}
return ;
}
Splay的初步学习的更多相关文章
- json2.js的初步学习与了解
json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...
- EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库
前提:搭建成功codefirst相关代码,参见EF Codefirst 初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...
- 初步学习python
自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...
- Git的初步学习
前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...
- 语法分析器初步学习——LISP语法分析
语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...
- 状态保持以及AJAX的初步学习
嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...
- LinQ的初步学习与总结
嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...
随机推荐
- Confluence 6 新 Confluence 安装配置一个数据源连接
如果在你的 Tomcat 中配置了数据源,并且Confluence 设置指南在安装的时候检测到这个配置的时候,配置数据源的选项将会提供给你进行配置.入股你希望使用数据源,请参考下面的配置. 1. 停止 ...
- Confluence 6 站点高级自定义
你可以继续编辑的全局布局文件来继续更新你的主面板.请查看 Customizing the Confluence Dashboard 页面来获得更多有关的信息.你需要具有一些基本的Velocity 知识 ...
- Confluence 6 基于 Confluence 数据中心的 SAML 单点登录
安全申明标记语言(Security Assertion Markup Language (SAML))是一个基于 XML 的数据格式,允许各个软件平台通过identity provider (IdP) ...
- 扇形多级菜单可配置Demo
预览效果 领导是想把这个做成复选框,所以做成了可以多选的... Demo下载:https://github.com/zhangzn3/arc-menu
- Practical Web Penettation Testing (the first one Mutillidae 大黄蜂)
1.now we looke at this book . I decide to make a brief review the book covers as follows (I straigh ...
- linux下的抓包
1. 查看网卡名字 cat /proc/net/dev 2.抓取外网进来的包 tcpdump -i eth0 port -s -w .pcap 3.抓取自己服务器上的两个程序之间访问的数据 换成 lo ...
- (转)一位资深程序员大牛给予Java初学者的学习路线建议
Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每 ...
- mysql常见安全加固策略
原创 2017年01月17日 21:36:50 标签: 数据库 / mysql / 安全加固 5760 常见Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini: ...
- AI学习吧
一:AI学习吧 项目描述 系统使用前后端分离的模式,前端使用vue框架,后端使用restframework实现. 项目需求 公司开发AI学习吧,由于公司需要一款线上学习平台,要开发具有线上视频学习.支 ...
- unicode解码
var newStr = System.Text.RegularExpressions.Regex.Unescape(str);