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 左偏树 (左偏树)的更多相关文章

  1. 图解数据结构树之AVL树

    AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节点的两个子 ...

  2. 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...

  3. B树、B+树的实现

    B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1)  每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...

  4. B树、B-树、B+树、B*树

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right) 2.所有结点存储一个关键字 3.非叶子节点的左指针指向小于其关键字的字数,右指针指向大于其关键字的字数: 如: B树的 ...

  5. 人人都是 DBA(VII)B 树和 B+ 树

    B 树(B-Tree)是为磁盘等辅助存取设备设计的一种平衡查找树,它实现了以 O(log n) 时间复杂度执行查找.顺序读取.插入和删除操作.由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方 ...

  6. 从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  7. B树和B+树

    当数据量大时,我们如果用二叉树来存储的会导致树的高度太高,从而造成磁盘IO过于频繁,进而导致查询效率下降.因此采用B树来解决大数据存储的问题,很多数据库中都是采用B树或者B+树来进行存储的.其目的就是 ...

  8. 转 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...

  9. 二叉树学习笔记之B树、B+树、B*树

    动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...

随机推荐

  1. BERT的优化演进方法汇总(持续更新)

    模型结构演进 本文以演进方向和目的为线索梳理了一些我常见到但不是很熟悉的预训练语言模型,首先来看看"完全版的BERT":RoBERTa: A Robustly Optimized ...

  2. Redis 中的原子操作(1)-Redis 中命令的原子性

    Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ...

  3. 我熬夜读完这份“高分宝典”,竟4面拿下字节跳动offer

    前言 怎样的契机? 实际上,目前毕业已经两年时间了,在大学时就已经开始关注字节跳动的发展.一开始,我是电气自动化专业的,大二清楚目标之后就转计算机了,大四进了一家小型的互联网公司实习,具体就不说哪家了 ...

  4. 工具分享:清理 Markdown 中没有引用的图片

    前言: 之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯.但是一是由于 notion 的服务器在国外,有时候很不稳定:二是由于 notion 的分享很不方便,把笔记分享给别人点开链接之 ...

  5. AT32F415 修改时钟和晶振方法(原创)

    1. 简介 我们几乎是国内第一批使用AT32F415芯片的客户,那个时候芯片还没涨价,岁月一切静好.使用AT32F415 做了几个小产品,也在持续出货.后来大家都知道,涨价缺货愈演愈烈.好在我们提前囤 ...

  6. DAST 黑盒漏洞扫描器 第二篇:规则篇

    0X01 前言 怎么衡量一个扫描器的好坏,扫描覆盖率高.扫描快.扫描过程安全 而最直接的效果就是扫描覆盖率高(扫的全) 怎么扫描全面,1 流量全面 2 规则漏报低 流量方面上篇已经讲过,这篇主要讲扫描 ...

  7. Egg上层框架CabloyJS是如何输出SQL语句日志的?

    背景 在Egg开发实践中,经常会遇到一个问题:如何查看刚刚执行过的Egg组装的原生SQL语句呢? 1. 现有方案 可以直接在项目的config配置文件中添加MySQL配置debug: true.这会启 ...

  8. Python 3函数的参数冒号注释

    Python 3.7版本,函数的参数可以通过冒号来进行注释 def f(ham: str, eggs: str = 'eggs') -> str : print("Annotation ...

  9. 技术分享 | app测试中常用的Android模拟器

    原文链接 Emulator Emualor 是 Android Studio 自带的模拟器,是官方提供的工具,Android 开发最常使用的就是这一款. 它功能非常齐全,电话本.通话等功能都可正常使用 ...

  10. Min-max 容斥与 kth 容斥

    期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...