#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. HTTP文件上传原理

    前言 对于这块知识点,我一直都是模糊的,不是非常清楚的.在平时的工作中,遇到上传的问题,也没有深入的去研究过,也都是直接用别人封装好的类来完成自己的工作.某一天,看了本书,说到这个知识点,一脸茫然,觉 ...

  2. js 实现 联动

    使用jQuery实现联动效果 应用场景:收货地址 1.准备三个下拉框 <select class="changeArea" id='province'> <opt ...

  3. Another option to bootup evidence files

    When it comes to booting up evidence files acquired from target disk, you got two options. One is VF ...

  4. Linux基础文件查找

    一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...

  5. Hadoop学习(7)-hive的安装和命令行使用和java操作

    Hive的用处,就是把hdfs里的文件建立映射转化成数据库的表 但hive里的sql语句都是转化成了mapruduce来对hdfs里的数据进行处理 ,并不是真正的在数据库里进行了操作. 而那些表的定义 ...

  6. Unity实现放大缩小以及相机位置平移实现拖拽效果

    放大缩小功能是游戏开发中用到的功能,今天就来讲一下Unity中放大缩小怎么实现. 1.IDragHandler, IBeginDragHandler, IEndDragHandler这三个接口是Uni ...

  7. 详解阿里P7架构师是怎么在Spring中实现事务暂停

    摘要 Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的.Spring的声明性事务分离可以应用到任何POJO目标对象,并且包 ...

  8. egg 自学入门demo分享

    目录 安装 项目 连接数据库 编写model 编写controller 添加路由 2018-08,本文适用于对egg有兴趣想要了解的同学 完整项目代码:https://github.com/NameH ...

  9. mysql中防止sql注入

    什么是sql注入 图片来源:百度百科 python 操作mysql产生sql注入问题 不用ORM框架,框架中已经集成了防范sql注入的功能,使用pymysql实践一下: # 导入pymysql模块 i ...

  10. 压力测试-jmeter

    1. 场景描述 新申请的服务器,要压测下python算法程序最多能执行多少条数据,有几年没用压力测试工具-jmeter了,重新下载了最新版本,记录下,也希望能帮到准备使用jmeter做压测的朋友. 2 ...