#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的更多相关文章

  1. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  2. 「模板」Splay

    代码说明 对于一些变量进行说明: 变量名 说明 rt 树根 ff[u] 点 \(u\) 的父节点,特别地, ff[rt]=0 ch[u][0|1] 点 \(u\) 的 左/右儿子 siz[u] 点 \ ...

  3. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  4. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  5. 【模板】splay维护序列

    题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h ...

  6. 【模板】Splay

    Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接 代码如下 #include <bits/stdc++.h> using namespace std; const i ...

  7. 【模板】Splay总结

    rentenglong大佬写的splay的梳理使我受益颇丰,特此做出一定的总结. 数据结构 定义了一个struct结构体. 为了在splay操作下储存根节点,我们宏定义了root 为 tree[0]. ...

  8. 【模板】NOIP模板汇总

    图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include&l ...

  9. [模板]平衡树splay

    气死我了,调了一个下午+两节课,各种大大小小的错误,各种调QAQ,最后总之是调出来了. 其实就是一个双旋操作,然后其他就是左儿子<当前节点<右儿子,剩下就是细节了. 题干: 题目描述 您需 ...

随机推荐

  1. 接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?

    前言 自动化测试应用越来越多了,尤其是接口自动化测试. 在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理. 而目前为主,大部分公司的产品都是java语言实现的.所以加密处理也是java实 ...

  2. jenkins未授权访问漏洞

    jenkins未授权访问漏洞 一.漏洞描述 未授权访问管理控制台,可以通过脚本命令行执行系统命令.通过该漏洞,可以后台管理服务,通过脚本命令行功能执行系统命令,如反弹shell,wget写webshe ...

  3. main方法中注入Spring bean

    在有些情况下需要使用main使用Spring bean,但是main方法启动并没有托管给Spring管理,会导致bean失败,报空指针异常. 可以使用 ClassPathXmlApplicationC ...

  4. The philosophy of ranking

    In the book Decision Quality, one will be trained to have three decision making system; one of them ...

  5. kafka消息的处理机制(五)

    这一篇我们不在是探讨kafka的使用,前面几篇基本讲解了工作中的使用方式,基本api的使用还需要更深入的去钻研,多使用才会有提高.今天主要是探讨一下kafka的消息复制以及消息处理机制. 1. bro ...

  6. python3学习-requests使用

    前面我们讲过了urllib模块,知道他是用于网络请求的,这一节讲的requests还是用于网络请求的,只不过urllib是官方模块,而requests是第三方的模块.用过的人都说他才是'人类使用的', ...

  7. java并发编程(十七)----(线程池)java线程池架构和原理

    前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类.我们先从他开始分析 ...

  8. abc -- 牛客

    题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...

  9. 10分钟安装Elasticsearch

    关注公众号 itweknow,回复"ES"获取<Elasticsearch权威指南 中文版>. 最近在尝试着搭建一个ELK(一个开源的实时日志分析平台),而本文所讲的E ...

  10. Git原理入门简析

    为了获得更好的阅读体验,建议访问原地址:传送门 前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的 ...