模板汇总——splay
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
const int N = 1e5 + ;
int tot = , root;
struct Node{
int son[], pre, sz;
void init(){
sz = ;
son[] = son[] = pre = ;
}
}tr[N]; void Push_Rev(int x){
if(!x) return ;
swap(lch(x), rch(x));
tr[x].rev ^= ;
}
void Push_up(int x){
if(!x) return;
tr[x].sz = tr[lch(x)].sz + tr[rch(x)].sz + ;
} void Push_Down(int x){
if(tr[x].rev){
tr[x].rev = ;
Push_Rev(lch(x));
Push_Rev(rch(x));
}
} void Reverse(int l, int r){
int pl = Find(l, root);
int pr = Find(r+, root);
Splay(pl, );
Splay(pr, pl);
Push_Rev(tr[pr].son[]);
Push_Up(tr[pr].son[]);
Push_Up(pr);
Push_Up(pl);
} int build(int ll, int rr){
int p = , x;
for(int i = rr; i >= ll; i--){
x = ++tot;
tr[x].init();
tr[x].son[] = p;
tr[p].pre = x;
Push_Up(x);
p = x;
}
return x;
} void rotate(int x){
int y = tr[x].pre;
int z = tr[y].pre;
int k = x == rch(y);
tr[x].pre = z;
tr[z].son[y == rch(z)] = x;
tr[y].son[k] = tr[x].son[k^];
tr[tr[y].son[k]].pre = y;
tr[x].son[k^] = y;
tr[y].pre = x;
Push_up(y);
} void splay(int x, int goal){
while(tr[x].pre != goal){
int y = tr[x].pre;
int z = tr[y].pre;
if(z != goal){
if((lch(y) == x) ^ (lch(z) == y)) rotate(x); ///x和y分别是y和z的同一段的儿子
else rotate(y);
}
rotate(x);
}
if(!goal) root = x;
Push_up(x);
}
int Find(int num, int x){
Push_Down(x);
if(num == tr[lch(x)].sz + ) return x;
if(num <= tr[lch(x)].sz) return Find(num, lch(x));
return Find(num - tr[lch(x)].sz - , rch(x));
}
void Insert_point(LL v, LL z){
int p = root, ff = ;
while(p && tr[p].val != v){
ff = p;
p = tr[p].son[ tr[p].val < v];
}
if(p){
tr[p].szz += z;
}
else {
p = ++tot;
if(ff) tr[ff].son[ tr[ff].val < v] = p;
tr[p].init(v, z);
tr[p].pre = ff;
}
splay(p, );
} void Collect(int x){
if(tr[x].son[]) Clear(tr[x].son[]);
if(tr[x].son[]) Clear(tr[x].son[]);
sta[++top] = x;
}
void Delete_tree(int l, int r){
int pl = Find(l, root);
int pr = Find(r+, root);
Splay(pl, );
Splay(pr, pl);
Collect(tr[pr].son[]);
tr[pr].son[] = ;
Push_Up(pr);
Push_Up(pl);
} void dfs(int x){
Push_down(x);
if(lch(x)) dfs(lch(x));
printf("%d ", tr[x].val);
if(rch(x)) dfs(rch(x));
}
模板汇总——splay的更多相关文章
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- 「模板」Splay
代码说明 对于一些变量进行说明: 变量名 说明 rt 树根 ff[u] 点 \(u\) 的父节点,特别地, ff[rt]=0 ch[u][0|1] 点 \(u\) 的 左/右儿子 siz[u] 点 \ ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- 【模板】splay维护序列
题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h ...
- 【模板】Splay
Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接 代码如下 #include <bits/stdc++.h> using namespace std; const i ...
- 【模板】Splay总结
rentenglong大佬写的splay的梳理使我受益颇丰,特此做出一定的总结. 数据结构 定义了一个struct结构体. 为了在splay操作下储存根节点,我们宏定义了root 为 tree[0]. ...
- 【模板】NOIP模板汇总
图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include&l ...
- [模板]平衡树splay
气死我了,调了一个下午+两节课,各种大大小小的错误,各种调QAQ,最后总之是调出来了. 其实就是一个双旋操作,然后其他就是左儿子<当前节点<右儿子,剩下就是细节了. 题干: 题目描述 您需 ...
随机推荐
- js 实现 联动
使用jQuery实现联动效果 应用场景:收货地址 1.准备三个下拉框 <select class="changeArea" id='province'> <opt ...
- JDK的可视化工具系列 (四) JConsole、VisualVM
JConsole: Java监视与管理控制台 代码清单1: import java.util.*; public class JConsoleDemo { static class OOMObject ...
- Quartz CronTrigger定时器表达式大全
CronTrigger是基于Calendar-like调度的.当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger.正如它的名字所暗示的那样,CronTrigg ...
- 史上最全面的SignalR系列教程-1、认识SignalR
SignalR 是什么? SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用, ...
- 【Java例题】7.5 文件题2-学生成绩统计
5.学生成绩统计.已有一个学生成绩文件,含有多位学生的各三门课的成绩:读取这个文件中的每位学生的三门课成绩,然后计算均分:最后对这些均分按照大于或小于75分的界限,分别写到另两个文件中. packag ...
- 深扒JVM,对它进行“开膛破肚”式解析!
1. 打怪升级,你绕不开JVM JVM,对Java程序员进阶而言,是一个绝对绕不开,也不能绕开的话题. 在你打怪升级.进阶蜕变的路上,势必会遇到项目上线中各种OOM.GC等问题,此时JVM的功底就至关 ...
- 消息中间件-activemq入门(二)
上一节我们了解了JMS规范并且知道了JMS规范的良好实现者-activemq.今天我们就去了解一下activemq的使用.另外我们应该抱着目的去学习,别忘了我们为什么要使用消息中间件:解耦系统之间的联 ...
- java并发编程(十五)----(线程池)java线程池简介
好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...
- 【CodeForces - 1200C】Round Corridor (数论gcd)
Round Corridor Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...
- eclipse项目导入idea jdk版本不一致😵
在导入eclipse项目到idea过程中遇到 Imported project refers to unkonwn jdks JavaSE-1.8 解决方法: file --> Project ...