【整合】SBT模板(全部操作)

插入,删除,前驱后继,第k大值,排名,最大值最小值8种询问外带核心左旋右旋Maintain

全套模板整合

从16:10开始写,写到了16:28

总计用时18min左右(前后误差不超过1min)

我的手速还真是快呢owo

这一次就是个小测试了。看来到现在SBT已经写熟练了0-0

可以去颓Splay和fhqTreap之类的了www

P.S.应该没写错吧。。。有什么写错了的有人看出来了马上告诉我QUQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct sbt
{
	int left,right,size,data;
}tree[100000];
int top,root;
int n;
int opt;
int key;
void left_rot(int &x)
{
	int y=tree[x].right;
	tree[x].right=tree[y].left;
	tree[y].left=x;
	tree[y].size=tree[x].size;
	tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1;
	x=y;
}
void right_rot(int &x)
{
	int y=tree[x].left;
	tree[x].left=tree[y].right;
	tree[y].right=x;
	tree[y].size=tree[x].size;
	tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1;
	x=y;
}
void Maintain(int &x,bool flag)
{
	if (!flag)
	{
		if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size)
		    right_rot(x);
		else
		if (tree[tree[tree[x].left].right].size>tree[tree[x].right].size)
		    left_rot(tree[x].left),right_rot(x);
		else
		return;
	}
	else
	{
		if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size)
		    left_rot(x);
		else
		if (tree[tree[tree[x].right].left].size>tree[tree[x].left].size)
		    right_rot(tree[x].right),left_rot(x);
		else
		return;
	}
	Maintain(tree[x].left,0);
	Maintain(tree[x].right,1);
	Maintain(x,1);
	Maintain(x,0);
}
void insert(int &x,int data)
{
	if (x==0)
	{
		x=++top;
		tree[x].size=1;
		tree[x].left=tree[x].right=0;
		tree[x].data=data;
	}
	else
	{
		tree[x].size++;
		if (data<tree[x].data) insert(tree[x].left,data);
		else insert(tree[x].right,data);
		Maintain(x,data>=tree[x].data);
	}
}
int remove(int &x,int data)
{
	tree[x].size--;
	if (data>tree[x].data)
	    remove(tree[x].right,data);
	else
	if (data<tree[x].data)
	    remove(tree[x].left,data);
	else
	{
		if (tree[x].left!=0&&tree[x].right==0)
		{
			int ret=x;
			x=tree[x].left;
			return x;
		}
		else
		if (tree[x].right!=0&&tree[x].left==0)
		{
			int ret=x;
			x=tree[x].right;
			return x;
		}
		else
		if (tree[x].left==0&&tree[x].right==0)
		{
			int ret=x;
			x=0;
			return ret;
		}
		else
		{
			int ret=tree[x].right;
			while (tree[ret].left) ret=tree[x].left;
			tree[x].data=tree[ret].data;
			remove(tree[x].right,tree[ret].data);
		}
	}
}
int select(int &x,int k)
{
	int r=tree[tree[x].left].size+1;
	if (k<r) return select(tree[x].left,k);
	else
	if (k>r) return select(tree[x].right,k-r);
	else
	return tree[x].data;
}
int rank(int &x,int data)
{
	if (x==0) return 0;
	if (data>tree[x].data) return tree[tree[x].left].size+1+rank(tree[x].right,data);
	else
	if (data<tree[x].data) return rank(tree[x].left,data);
	else
	return tree[tree[x].left].size+1;
}
int prev(int &x,int y,int data)
{
	if (x==0) return y;
	if (data>=tree[x].data) return prev(tree[x].right,x,data);
	else return prev(tree[x].left,y,data);
}
int succ(int &x,int y,int data)
{
	if (x==0) return y;
	if (data>=tree[x].data) return succ(tree[x].right,y,data);
	else return succ(tree[x].left,x,data);
}
int getmin()
{
	int x=root;
	while (tree[x].left) x=tree[x].left;
	return tree[x].data;
}
int getmax()
{
	int x=root;
	while (tree[x].right) x=tree[x].right;
	return tree[x].data;
}
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&opt);
		switch (opt)
		{
			case 1:
				scanf("%d",&key);
				insert(root,key);
				break;
			case 2:
				scanf("%d",&key);
				printf("%d\n",rank(root,key));
				break;
			case 3:
				scanf("%d",&key);
				printf("%d\n",select(root,key));
				break;
			case 4:
				printf("%d\n",getmax());
				break;
			case 5:
				printf("%d\n",getmin());
				break;
			case 6:
				scanf("%d",&key);
				printf("%d\n",succ(root,0,key));
				break;
			case 7:
				scanf("%d",&key);
				printf("%d\n",prev(root,0,key));
				break;
			case 8:
				scanf("%d",&key);
				remove(root,key);
		}
	}
}
时间: 2024-08-30 02:32:44

【整合】SBT模板(全部操作)的相关文章

SBT 模板不完全总结,后续待填

1 int top; 2 struct SBT { 3     int L,R,size,key; 4     void init() { 5         L=R=0; size=1; 6     } 7 }T[MAX]; 8  9 void R_Roate(int &t) {   // 右旋转10     int k = T[t].L;11     T[t].L=T[k].R;12     T[k].R=t;13     T[k].size=T[t].size;14     T[t].si

ThinkPHP3.2.3整合smarty模板(二)

前言:继ThinkPHP3.2.3整合smarty模板(一)之后,继续来探讨一下tp框架整合smarty模板,看到有人在群上问到怎么使用自定义的常量,今天就具体来谈谈: 一.开发一个项目,必不可少会用到很多的自定义常量,比如定义一些常量作为引入静态文件,但在smarty模板中怎么直接使用这些常量呢? 1.定义常量:如:define('__IMAGE__', __STATIC__ . '/img'),在入口文件定义或者其他文件定义这个都无所谓,若在其他文件定义,则需要引入一下; 2.在模板中使用常

ThinkPHP3.2.3整合smarty模板(一)

一.php模板引擎有哪些? 1.1 PHPLIB:一套古老且主流的模板引擎,直接在html中使用PHP变量进行编程: 1.2 Template Blocks:一款轻巧且速度非常快的PHP模板引擎,支持xml语法: 1.3 TinyButStrong:肖墙模板,业界非常著名好用的模板引擎,直接支持Dreamweaver插件编辑: 1.4 Rain TPL:易于使用和安装引擎,有6个标签,3个PHP函数和2个PHP类,支持对模板中的相对路径自动转换为绝对路径: 1.5 PHPTAL:是一个ZPT的P

ThinkPHP整合Smarty模板引擎的使用以及查询方法汇总

其实说到整合smarty我们根本就没有作什么,要做的主要还是对于模板分配各种变量的使用,这才是重点,其次还有一些配置信息要自己去填写;先说一下配置,同样的,在主目录的common下面的config文件,把配置信息写入里面就可以了,其中主要有下面一下的配置信息. 'TMPL_ENGINE_TYPE'      =>  'Smarty', //'TMPL_L_DELIM'          =>  '<{',            // 模板引擎普通标签开始标记 //'TMPL_R_DELI

「快学springboot」SpringBoot整合freeMark模板引擎

前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来发现搜索引擎难以收集由JS渲染的页面,所以前段时间,是用jQuery+FreeMark重写了我的博客前端页面.感兴趣的朋友,可以点击下面的查看更多的链接跳转至本人的博客. 在springboot中,不推荐使用JSP(其实任何项目都不推荐使用JSP),而是推荐使用模板引擎,如FreeMark.其实使用

SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图

在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: Thymeleaf FreeMarker Velocity Groovy Mustache Spring Boot 推荐使用这些模板引擎来代替 Jsp,Thymeleaf 只是其中一种,下面我们来简单聊聊Thymeleaf及实践一下如何整合Spring Boot和Thymeleaf. 1.Thyme

springboot整合thymleaf模板引擎

thymeleaf作为springboot官方推荐使用的模板引擎,简单易上手,功能强大,thymeleaf的功能和jsp有许多相似之处,两者都属于服务器端渲染技术,但thymeleaf比jsp的功能更强大. 1. thymeleaf入门 1.1 引入坐标 <!--springBoot整合thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

SBT模板

1 struct SBT{ 2 int treeCnt, root; 3 struct tnode{int data, lc, rc, size;} tree[maxn]; 4 inline void clear(){treeCnt = 0; root = 0;} 5 inline void leftRot(int &x){ 6 int k = tree[x].rc; 7 tree[x].rc = tree[k].lc; 8 tree[k].lc = x; 9 tree[k].size = tr

Spring学习4_整合Hibernate进行数据库操作

很多项目中后端通过Spring+hibernate进行数据库操作,这里通过一个简单Demo来模拟其原型. 代码结构 1.Spring配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSche