Splay模板

打LCT的时候发现Splay很不熟, 因此这里贴一下模板
洛谷P3369
https://www.luogu.org/problem/show?pid=3369#sub

/*
提一些要注意的点:
1. 注意判断边界, 不要访问到空节点
2. 每一次操作或访问完以后, 记得要splay到root
3. insert操作只要update当前节点和父亲节点即可, 因为还会上旋到root 
4.牢记双旋的打法
5. delete时需要把将要delete的点上旋的根, 因此可与find共用函数 
6. 在找一个bst中原本不存在的点的前驱或后继时, 可先将该点插入, 然后找前驱或后继, 然后再删除 
*/
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
void read(int &x)
{x = 0;char c;int flag = 1;while(! isgraph(c = getchar()))if(c == '-')flag *= - 1;while(isgraph(c))x = x * 10 + c - '0', c = getchar();x *= flag;
}
const int MAXN = (int)1e5;
int top;
struct node
{int key, cnt, ch[2], size, fa;
}T[MAXN + 64];
int root;
void create(int x)
{T[top].ch[0] = T[top].ch[1] = - 1;T[top].key = x;T[top].cnt = 1;T[top ++].size = 1;
}
void update(int u)
{T[u].size = T[u].cnt;if(T[u].ch[0] != - 1)T[u].size += T[T[u].ch[0]].size;if(T[u].ch[1] != - 1)T[u].size += T[T[u].ch[1]].size;
}
inline int getson(int p)
{return  (p == T[T[p].fa].ch[1]);
}
void rotate(int p)
{int fa = T[p].fa, fafa = T[fa].fa, k = getson(p);T[fa].ch[k] = T[p].ch[k ^ 1];T[T[p].ch[k ^ 1]].fa = T[p].fa;T[p].ch[k ^ 1] = fa;T[fa].fa = p;T[p].fa = fafa;if(fafa != - 1)T[fafa].ch[T[fafa].ch[1] == fa] = p;update(fa), update(p);
}
void splay(int u)
{for(int fa; (fa = T[u].fa) != - 1; rotate(u))if(T[fa].fa != - 1)rotate((getson(u) == getson(fa)) ? fa : u);root = u;
}
void insert(int x)
{if(root != - 1){int p = root, fa = - 1;while(1){if(T[p].key == x){T[p].cnt ++;update(p), update(fa);//这里只需要更新p和fa就可以了 splay(p);//因为这里还会更新到p到根节点上的所有祖先 break;}fa = p;p = T[p].ch[x > T[fa].key];if(p == - 1){create(x);T[top - 1].fa = fa;T[fa].ch[x > T[fa].key] = top - 1;update(fa);splay(top - 1);break;}}}elsecreate(x), T[top - 1].fa = root, root = top - 1;
}
int find(int x) //写得有点奇怪了, 因为强行把两个操作合并在一起233 
{int p = root, sum = 0;while(1){if(x < T[p].key)p = T[p].ch[0];else{sum += (T[p].ch[0] == - 1) ? 0 : T[T[p].ch[0]].size;if(x == T[p].key){splay(p);return sum + 1;}sum += T[p].cnt;p = T[p].ch[1];}}
}
int get_pre()
{int p = T[root].ch[0];while(T[p].ch[1] != - 1)p = T[p].ch[1];return p;
}
void del(int x) //下面就是无聊的分类讨论了 
{find(x);if(T[root].cnt > 1){T[root].cnt --;update(root);return;}if(T[root].ch[0] == - 1 && T[root].ch[1] == - 1){root = - 1;return;}if(T[root].ch[1] == - 1){int tmp = root;root = T[root].ch[0];T[root].fa = - 1;return;}elseif(T[root].ch[0] == - 1){int tmp = root;root = T[root].ch[1];T[root].fa = - 1;return;}int pre = get_pre(), tmp = root;splay(pre);T[T[tmp].ch[1]].fa = root;T[root].ch[1] = T[tmp].ch[1];update(root);
}
void print(int x)
{if(x < 0)putchar('-');if(x == 0)putchar('0');int ans[10], top = 0;while(x)ans[top ++] = x % 10, x /= 10;for(; top; top --)putchar(ans[top - 1] + '0');
}
int get_rank(int x)
{int p = root;while(1){if(T[p].ch[0] != - 1 && x <= T[T[p].ch[0]].size)p = T[p].ch[0];else{int tmp = ((T[p].ch[0] != - 1) ? T[T[p].ch[0]].size : 0) + T[p].cnt;if(x <= tmp)return T[p].key;x -= tmp;p = T[p].ch[1];     }}
}
int get_next()
{int p = T[root].ch[1];while(T[p].ch[0] != - 1)p = T[p].ch[0];return p;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("L3369.in", "r", stdin);freopen("L3369.out", "w", stdout);#endifint n;read(n);root = - 1;top = 0;for(int i = 0; i < n; i ++){int opt, x;read(opt), read(x);switch (opt){case 1: insert(x); break;case 2: del(x); break;case 3: print(find(x)); putchar('\n'); break;case 4: print(get_rank(x)); putchar('\n'); break;case 5: {insert(x);print(T[get_pre()].key);putchar('\n');del(x);break;}case 6:{insert(x);print(T[get_next()].key);putchar('\n');del(x);break;}}}
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/6402841.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理与计算机视觉 基础、经典以及最近发展

申明&#xff1a;本文非笔者原创&#xff0c;原文转载自&#xff1a;http://blog.csdn.net/liuyue2046/article/details/12658441 ***************************************************************************************************************************************…

【HTML学习】——一个网页HTML编程的构成

目录 1、html网页构成介绍 2、HTML标签介绍 全部的html标签&#xff1a; HTML: HyperText Markup Language | MDNhttps://developer.mozilla.org/en-US/docs/Web/HTML 一个网页文件一般由.html结尾的文件组成&#xff0c;主要由不同的标签对和内容组成&#xff0c;常见的html…

hbase里插入big int数据用Phoenix查看的报错问题

Phoenix建表create table "test_big_int"("ROW" varchar primary key,"ci"."column1" bigint) 在hbase里put数据hbase 里面进行put: put test_big_int,001,ci:column1,1 在Phoenix里进行查看&#xff08;问题出现&#xff09;第二个尝…

机器学习:利用卷积神经网络实现图像风格迁移 (一)

相信很多人都对之前大名鼎鼎的 Prisma 早有耳闻&#xff0c;Prisma 能够将一张普通的图像转换成各种艺术风格的图像&#xff0c;今天&#xff0c;我们将要介绍一下Prisma 这款软件背后的算法原理。就是发表于 2016 CVPR 一篇文章&#xff0c; “ Image Style Transfer Using Co…

jquery中attr和prop的区别

在高版本的jquery引入prop方法后&#xff0c;什么时候该用prop&#xff1f;什么时候用attr&#xff1f;它们两个之间有什么区别&#xff1f;这些问题就出现了。 关于它们两个的区别&#xff0c;网上的答案很多。这里谈谈我的心得&#xff0c;我的心得很简单&#xff1a; •对于…

博客园自定义样式

碎碎念&#xff1a; 已经很长时间没有更新过博客了&#xff0c;分析一下&#xff0c;一个是太懒了。。。所以很久没整理一下了。还有就是嫌弃博客园默认的博客界面真的太丑了&#xff0c;作为颜控的我真的无法忍受啊。个人比较喜欢用makedown来编写博客&#xff0c;但是博客园自…

【CSS】——cascading stylesheets层叠式样式表

目录 0、CSS介绍 1、CSS语句组成 2、CSS选择器的选择方式 1&#xff09;CSS选择器的方式和选择器大全&#xff1a; 2&#xff09;常见的三种方式&#xff1a; 3、添加CSS方式 1&#xff09;外部样式表 html调用css代码 css文件 html文件 展示 2&#xff09;内部样式表…

四 Apache Axis2 部署 WebService

最新版本1.7.4发布日期2016-10-21 Axis2官网下载如下文件&#xff1a; axis2-1.6.2-bin&#xff1a;二进制的axis axis2-1.6.2-docs&#xff1a;帮助文档 axis2-1.6.2-war&#xff1a;axis.war 文件 axis2-eclipse-codegen-plugin-1.6.2&#xff1a;Eclipse axis client 插件 a…

安装OpenCV:OpenCV 2.4.8或OpenCV 2.4.9 +VS 开发环境配置

因为读研期间的研究方向是图像处理&#xff0c;所以浅墨这段时间闭门研究了很多OpenCV和图像处理相关的知识与内容。眼看自己积累到一定的程度了&#xff0c;于是决定开始开设这个OpenCV系列专栏&#xff0c;总结自己所学&#xff0c;也分享知识给大家。 好了&#xff0c;这篇文…

powerdesigner中如何在自动生成建表SQL时添加模式名schema

1、在主菜单中选择“模型”→“users and roles”→“users”&#xff0c;新增一个user&#xff0c;其中"name"字段就是要添加的模式名。 2、在新增表时&#xff0c;在表属性的“general”页签中选择"owner"&#xff0c;选择刚才新增的user&#xff0c;即可…

spark 免密码登录- ssh 指定非22端口

vi /etc/profile在profile 文件最后一行加入命令&#xff1a; export SPARK_SSH_OPTS"-p 7315" #注&#xff1a;7315 是ssh 端口转载于:https://www.cnblogs.com/chengjunhao/p/8336086.html

【django学习】——Django介绍和实战(开发简易版博客网页)

目录 0、视频链接 1、环境配置 2、django基本命令 1&#xff09;常见命令 2&#xff09;数据库相关的Django命令 3、Django项目 1&#xff09;Django创建项目 2&#xff09;项目目录介绍 3&#xff09;运行初始化的Django项目 4、Django应用 1&#xff09;Django项目和Djan…

求最大子数组03

题目: 返回一个二维整数数组中最大联通子数组的和。 要求&#xff1a; 1. 输入一个二维整形数组&#xff0c;数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 2.程序要使用的数组放在一个叫 input.txt 的文件中&#xff0c; 文件格式是: 数组的行…

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.

使用VS2005以上版本&#xff08;VS2005、VS2008、VS2010&#xff09;编译在其他编译器下正常通过的C语言程序&#xff0c;你可能会遇到类似如下的警告提示&#xff1a;引用内容 warning C4996: strcpy: This function or variable may be unsafe. Consider using strcpy_…

纠错——【Singleton array array(0.2) cannot be considered a valid collection.】

# 将数据集按照比例划分为训练集和测试集 def split_datas(datas,labels,random_state1,train_size0.9,test_size0.1):train_data, test_data, train_label, test_label sklearn.model_selection.train_test_split(datas,labels,random_staterandom_state,# 作用是通过随机数来…

Android Studio 模拟器 不要皮肤,效果更好

新建或者编辑虚拟机时&#xff0c;皮肤选择“No Skin”即可&#xff0c;第二张图片就是无皮肤的效果&#xff0c;看着更爽啊。 转载于:https://www.cnblogs.com/toSeeMyDream/p/6265501.html

SqlServer自定义排序

在实际项目中&#xff0c;有时会碰到数据库SQL的特殊排序需求&#xff0c;举几个例子&#xff0c;作为参考。 1、自定义优先级 一种常见的排序需求是指定某个字段取值的优先级&#xff0c;根据指定的优先级展示排序结果。比如如下表&#xff1a; Create TABLE Fruit (id INT ID…

JAVA 笔记(三)

NullPointerException:空指针异常 原因&#xff1a;数组已经不再指向堆内存了。而你还用数组名去访问元素。对于查找问题&#xff0c;如果找到就返回其索引值&#xff0c;如果找不到就要返回一个负数&#xff08;一般是负一&#xff09;这是必须的&#xff0c;否则如果找不到&a…

ERROR: SampleCB() - buffer sizes do not match 解决方法

笔记本有内置摄像头。Windows7驱动已经安装成功&#xff0c;利用QQ测试摄像头正常。但是利用OpenCV简单的摄像头操作后&#xff0c;就会出现ERROT: SampleCB() - buffer sizes do not match的问题。下面是代码&#xff1a; #include<iostream> #include <opencv2/co…

安装Wamp后 Apache无法启动的解决方法

安装Wamp后 Apache无法启动的解决方法&#xff0c;网上的解决方案可以说是五花八门&#xff0c;有些说了一大推&#xff0c;一点作用都起不到。 其实解决方法只需两步&#xff1a; 1、安装路径不能包含有中文&#xff0c;这个我不知道为什么&#xff0c;总之如果安装路径中包含…