#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. Flink状态专题:keyed state和Operator state

            众所周知,flink是有状态的计算.所以学习flink不可不知状态.         正好最近公司有个需求,要用到flink的状态计算,需求是这样的,收集数据库新增的数据.       ...

  2. 有容云-PPT | 当微服务遇见容器

    编者注: 本文为10月29日有容云高级技术顾问龙淼在Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一期畅聊容器技 ...

  3. idea使用大全(加载mysql驱动)

    1.载入mysql驱动 找到项目结构(project structure) 选Modules 找到右边的加号选择第一个 OK

  4. 201312-2ISBN号码

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  5. 记一次mysql主从同步因断电产生的不能同步问题 1236 1032

    背景: 项目新上线一个月,qa需要测试断电服务拉起,服务拉起成功后,发现mysql主从异常,以下是发现的问题以及解决方案 问题1: Slave_IO_Running:  No 一方面原因是因为网络通信 ...

  6. 一段代码分清global和nonlocal

    废话不多说,直接代码啊~~~ a=999 b=99999 def test1(): a=888 b=88888 print('a={}'.format(a)) print('b={}'.format( ...

  7. 100天搞定机器学习|Day35 深度学习之神经网络的结构

    100天搞定机器学习|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习 ...

  8. Javascript中,实现类与继承的方法和优缺点分析

    Javascript是一种弱类型语言,不存在类的概念,但在js中可以模仿类似于JAVA中的类,实现类与继承 第一种方法:利用Javascript中的原型链 //首先定义一个父类 function An ...

  9. JS之null与undefined的区别

    null表示尚未存在的对象 js 代码: alert(null == document.getElementById('notExistElement'));  //output "true ...

  10. wordpress修改登录密码

    wordpress忘记密码更改 网上搜到的方法: 1.后台邮件重置: 2,phpmyadmin登录数据库,执行mysql语句或者在wp_users表中重置密码: 3,利用php文件重置. 这是提供一种 ...