首页 > 其他分享 >普通平衡树

普通平衡树

时间:2023-10-19 21:15:11浏览次数:29  
标签:rt int 普通 rnd lt split 平衡 考虑

很久以前,我很抗拒使用平衡树。
但是这现在是 8 级算法,我不得不学之。
FHQ-Treap
核心只有两个操作 split 和 merge。
考虑像 Treap 一样每个点打上 rand,使得其满足是 rnd 的小根堆。
然后考虑分裂。
考虑每次对于值归类 <= 的归在 \(lt\),其他归在 \(rt\)。
考虑每次归入 \(lt\) 一个数,那么其他的就是考虑填 lt 的右儿子。
那么同理,归入 \(rt\) 一个数,那么就是考虑填 rt 的左儿子。
按照一条链分裂后,记得 pushup。
那 merge 就考虑 \(lt, rt\) 此时已经满足了 \(max_{lt} \leq min_{rt}\),我们每次要满足小根堆。
所以如果 \(rnd_x \leq rnd_y\) 那么把 \(y\) 插到 \(x\) 的右儿子。否则把 \(x\) 插入到 \(y\) 的左儿子,pushup 后 return 根即可。

void split (int x, int k, int & lt, int & rt) {
	if (!x) { lt = rt = 0; return ; }
	if (tr[x].v <= k) { lt = x; split(rc(x), k, rc(x), rt); }
	else { rt = x; split(lc(x), k, lt, lc(x));}
	pushup(x);
}
void split (int x, int k, int &lt, int & rt) {
	if (!x)  { lt = rt = 0; return ; }
    pushdown(x);
	if (sz[lc[x]] >= k) {
		rt = x;
		split(lc[x], k, lt, lc[x]);
	} else {
		lt = x;
		split(rc[x], k - sz[lc[x]] - 1, rc[x], rt);
	}
	pushup(x);
}
int merge (int x, int y) {
	if (!x || !y) return x | y;
    pushdown(x), pushdown(y);
	if (rnd[x] <= rnd[y]) {
		rc[x] = merge(rc[x], y), pushup(x); 
		return x;
	} else {
		lc[y] = merge(x, lc[y]), pushup(y); 
		return y;
	}
}

如果有 \(reverse\)
其实主要是为了做文本编辑器写的()。

标签:rt,int,普通,rnd,lt,split,平衡,考虑
From: https://www.cnblogs.com/Custlo/p/17775638.html

相关文章

  • redis普通连接和连接池, redis字符串类型,redis hash类型, redis列表类型
    1redis普通连接和连接池......
  • 与普通探头相比,高压差分探头的参数含义和测试方法有什么不同
    电源测试中大多数电压测试是浮地测试,需要用差分探头测试。很多初级工程师在用多个探头进行电源测量时,刚开机电源产品就“炸机”,甚至示波器也发生损坏。这是因为示波器探头之间是共地的,在同时测量电源原边和副边的时候,如果用一根探头接原边的地,另一根探头接副边的地,相当于把电源......
  • 【数据结构】7.平衡搜索树(AVL树和红黑树)
    0.概述对于普通的搜索树,如果一直插入比第一个元素小的元素,它会退化成一个无限向左下角眼神的单链表,使得时间复杂度退化为O(n)。如果我们在插入时保持树的结构是平衡的,则可以保证查找、插入和删除的时间复杂度有对数级的时间性能,下面讲到的AVL树和红黑树都是平衡搜索树,通过旋......
  • redis介绍和安装、redis普通连接和连接池、redis字符串类型、redis hash类型、redis列
    redis介绍和安装#1redis什么-数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样-mysql关系型数据库(oracle,sqlserver,postgrasql)-非关系型数据(nosql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。-没有sql:没有sql语句......
  • 云熙:普通改活动层板
    1.圆表示活动层板:2.选中——板件——修改属性——连接里改活动层板批量改活动层板或头部——连接——活动板件......
  • 父图子图平衡
      ......
  • 平衡进制问题/对称的2k+1进制问题
    定义平衡\(2k+1\)进制数码为\(-k,-(k-1),,,0,,,k-1,k\),请求出一个十进制数的\(2k+1\)进制表示。对于该问题,解决的思路是首先算出普通的\(2k+1\)进制下的表示,然后分别对每一位进行考虑.1:这一位的数属于\(0-k\)不用管2:这一位的数属于\(k+1-2k\)设此数等于$k+p$,则将下一......
  • P9233 [蓝桥杯 2023 省 A] 颜色平衡树 (dfs序 莫队)
    P9233[蓝桥杯2023省A]颜色平衡树(dfs序莫队)莫队原理:https://zhuanlan.zhihu.com/p/115243708对于树上的每个结点,按照dfs序打上时间戳,这样就可以把每一个结点对应的子树的答案转化为一个区间的答案。将子树询问离线下来变成\(n\)个区间查询。用\(cnt\)数组维护颜色......
  • 普通路由器TP-LINK+三层交换机华为S5700组网
    #配置交换机S5700,添加两个vlan,2用于连接路由器,3用于接入用户<Quidway>system-view[Quidway]sysnameS5700S[S5700S]vlanbatch23[S5700S]isvlan#配置连接用户的接口和对应的VLANIF接口[S5700S]intGigabitEthernet0/0/17[S5700S-GigabitEthernet0/0/17]portlin......
  • Linux系统管理(1) 开启与禁用普通用户sudo权限
    1.sudo命令简介sudo是Linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部root命令的一个工具。Linux系统下,为了安全,一般来说我们操作都是在普通用户下操作,但有时普通用户需要用到root权限,比如在安装软件的时候。这个时候如果我们切回root用户下效率就会比较低,所以用su......