模板汇总——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,最后总之是调出来了. 其实就是一个双旋操作,然后其他就是左儿子<当前节点<右儿子,剩下就是细节了. 题干: 题目描述 您需 ...
随机推荐
- 【MySQL】日常小技巧汇总,更新中……
创建表时修改自增主键,添加 AUTO_INCREMENT=<Number> ,例如: CREATE TABLE `table_name` ( `id` int(11) unsigned N ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- OLE--SWT高级控件
OLE和ActiveX控件的支持 OLE(Object Link Embeded)是指在程序之间链接和嵌入对象数据.通过OLE技术可以在一个应用程序中执行其他的应用程序. 而ActiveX ...
- Task CancellationTokenSource和Task.WhenAll的应用
Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...
- div 环形排列
javascript-按圆形排列DIV元素(一)---- 分析 效果图: 一.分析图: 绿色边框内:外层的DIV元素,相对定位; 白色圆形框:辅助分析的想象形状; 白点:为白色圆形的圆心点,中心点,点 ...
- 简易数据分析 09 | Web Scraper 自动控制抓取数量 & Web Scraper 父子选择器
这是简易数据分析系列的第 9 篇文章. 今天我们说说 Web Scraper 的一些小功能:自动控制 Web Scraper 抓取数量和 Web Scraper 的父子选择器. 如何只抓取前 100 ...
- ibatis 核心原理解析!
关注下方公众号,可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码.虽然最后证明问题的原因与 ibat ...
- javascript 异步请求封装成同步请求
此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...
- sublime text 3 15个常用插件介绍
1.ColorPicker 功能:调色板(需要输入颜色时,可直接选取颜色) 使用:快捷键Windows: ctrl+shift+c 2.Emmet 功能:编码快捷键,前端必备 使用:在输入代码段后,按 ...
- nginx负载均衡策略url_hash配置方法
参考文章: https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/ 根据路径,进行一致性hash,具体的配 ...