P3369 【模板】普通平衡树 平衡树模板

过了一遍平衡树,把代码进行了标注,方便以后回顾。

学平衡树主要为了处理区间翻转问题,和LCT(今天牛客多校考到了。。先回顾一下前置芝士)

#include <bits/stdc++.h>
const int N = 100005;

struct Splay 
{
	int rt, tot, fa[N], ch[N][2], val[N], cnt[N], sz[N];
	//sz[x]:x节点子树的大小;cnt[x]:与x节点权值相同的数的个数;val[x]:x节点的权值 
	inline void init()
	{
		rt=tot=0;
	}
  	inline void maintain(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + cnt[x]; }//更新节点x的sz 
  	inline bool get(int x) { return x == ch[fa[x]][1]; }//x是否是其父亲节点的右儿子 
  	inline void clear(int x) {ch[x][0] = ch[x][1] = fa[x] = val[x] = sz[x] = cnt[x] = 0;}//删除节点x 
  	inline void rotate(int x) //把x与其父亲节点交换 
	{
	    int y = fa[x], z = fa[y], chk = get(x);
	    ch[y][chk] = ch[x][chk ^ 1]; //利用性质,进行更改节点 
	    fa[ch[x][chk ^ 1]] = y;
	    ch[x][chk ^ 1] = y;
	    fa[y] = x;
	    fa[x] = z;
	    if (z) ch[z][y =
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值