LuoguP3377 左偏树 (左偏树)
TLE but corrct in most cases.
inline int Find(int x){
//be careful with the way used for finding your grand papa
for(; fa[x]; x = fa[x]);
return x;
}
inline int Merge(int x,int y){
if(!x) return y;
if(!y) return x;
if(val[x] > val[y] || (val[x] == val[y] && x > y)) x^=y^=x^=y;
son[x][1] = Merge(son[x][1], y);
fa[son[x][1]] = x;
if(dis[son[x][1]] > dis[son[x][0]]) swap(son[x][1], son[x][0]);
dis[x] = dis[son[x][1]] + 1;
return x;
}
inline void Del(int x){
val[x] = -1;
fa[son[x][1]] = fa[son[x][0]] = 0;
Merge(son[x][1], son[x][0]);
}
AC with an undescriable magic.
inline int Find(int x){
return x == fa[x] ? x : fa[x] = Find(fa[x]);
}
inline int Merge(int x,int y){
if(!x) return y;
if(!y) return x;
if(val[x] > val[y] || (val[x] == val[y] && x > y)) swap(x, y);
son[x][1] = Merge(son[x][1], y);
fa[son[x][0]] = fa[son[x][1]] = x;
if(dis[son[x][0]] < dis[son[x][1]]) swap(son[x][0], son[x][1]);
dis[x] = dis[son[x][1]] + 1;
return x;
}
int del[N];
inline void Del(int x){
del[x] = true;
fa[son[x][0]] = son[x][0];
fa[son[x][1]] = son[x][1];
fa[x] = Merge(son[x][0], son[x][1]);//QAQ
/*
Ah, it seems as father is not useful for himself anymore, he becomes a rope for his son to climb higher...
anyway, this program goes well with this sentence, so who care about the reason.
He who laughs last, laughs best...
*/
}
use struct
struct LeftTree{
int l,r,val,dis;
}t[N];
//int son[N][2],fa[N],val[N],dis[N];
int fa[N];
inline int Find(int x){
return x == fa[x] ? x : fa[x] = Find(fa[x]);
}
inline int Merge(int x,int y){
if(!x) return y;
if(!y) return x;
if(t[x].val > t[y].val || (t[x].val == t[y].val && x > y)) swap(x, y);
t[x].r = Merge(t[x].r, y);
fa[t[x].l] = fa[t[x].r] = x;
if(t[t[x].l].dis < t[t[x].r].dis) swap(t[x].l, t[x].r);
t[x].dis = t[t[x].r].dis + 1;
return x;
}
int del[N];
inline void Del(int x){
del[x] = true;
fa[t[x].l] = t[x].l;
fa[t[x].r] = t[x].r;
fa[x] = Merge(t[x].l, t[x].r);//QAQ
/*
Ah, it seems as father is not useful for himself anymore, he becomes a rope for his son to climb higher...
anyway, this program goes well with this sentence, so who care about the reason.
He who laughs last, laughs best...
*/
}
LuoguP3377 左偏树 (左偏树)的更多相关文章
- 图解数据结构树之AVL树
AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节点的两个子 ...
- 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...
- B树、B+树的实现
B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1) 每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...
- B树、B-树、B+树、B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right) 2.所有结点存储一个关键字 3.非叶子节点的左指针指向小于其关键字的字数,右指针指向大于其关键字的字数: 如: B树的 ...
- 人人都是 DBA(VII)B 树和 B+ 树
B 树(B-Tree)是为磁盘等辅助存取设备设计的一种平衡查找树,它实现了以 O(log n) 时间复杂度执行查找.顺序读取.插入和删除操作.由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方 ...
- 从B 树、B+ 树、B* 树谈到R 树
从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...
- B树和B+树
当数据量大时,我们如果用二叉树来存储的会导致树的高度太高,从而造成磁盘IO过于频繁,进而导致查询效率下降.因此采用B树来解决大数据存储的问题,很多数据库中都是采用B树或者B+树来进行存储的.其目的就是 ...
- 转 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...
- 二叉树学习笔记之B树、B+树、B*树
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...
随机推荐
- MySQL中读页缓冲区buffer pool
Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理.我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS ...
- 高通(QCOM)sensor bring up
高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...
- Full卷积、Same卷积、Valid卷积、带深度的一维卷积
转载和参考以下几个链接:https://www.cnblogs.com/itmorn/p/11177439.html; https://blog.csdn.net/jack__linux/articl ...
- vue虚拟dom和diff算法
vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...
- 万字剖析Ribbon核心组件以及运行原理
大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...
- 文件输入输出处理-File
大佬的理解-><IO流和File> 1.File类 File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件.通过调用File类提供的各种方法, ...
- 【Java集合】ArrayDeque源码解读
简介 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列. ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的. 它既可以作为队列也可以作为栈. 继承体系 Arr ...
- 关于各种Vue UI框架中加载进度条的正确使用
这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...
- 缤纷多彩的WPF样式框架,开源项目
下面介绍的四种主流样式框架(最近项目需要,所以了解了一些),在Nuget及Github均可以找到~ 首推样式框架MahApp.Metro 再推样式框架ModernUI 三推样式框架MaterialDe ...
- Python列表解析式的正确使用方式(二)
高级解析式 条件逻辑早些时候,我向您展示了这个公式: python学习交流群:660193417### new_list = [expression for member in iterable] 公 ...