首页 > 其他分享 >全局平衡二叉树

全局平衡二叉树

时间:2023-11-07 20:46:30浏览次数:28  
标签:zson return int ed 二叉树 平衡 now 全局 ls

一种常数较小的能在单次 \(O(\log n)\) 时间内解决链修改链查询的数据结构。

普通的 LCT 也是 \(O(\log n)\) 的,但是常数巨大。原因是它用辅助树维护了一个动态的虚实链剖分,在没有动态加边删边的问题中这显然是没有必要的。我们考虑将 LCT 强行静态化来减小长度。

具体的,我们仍用类似 LCT 的结构来维护树的一个轻重链剖分。对于一条重链,我们不用 splay 而是用一棵静态的二叉搜索树。每次将点权设为轻子树的 \(siz\) 和,求出链的带权重心,往两边递归建树。建树的代码:

inline int build(int now) {
	vector<int> s;
	for (int i = now; i; i = zson[i]) vis[i] = 1;
	for (int i = now; i; i = zson[i]) {
		for (int j = ed[i].head; j; j = ed[j].nxt) {
			int v = ed[j].to;
			if (vis[v]) continue;
			fa[build(v)] = i;
		} s.push_back(i); lsiz[i] = siz[i] - siz[zson[i]];
	}
	auto calc = [&s](auto &f, int l, int r) {
		if (l > r) return 0;
		ll sum = 0, cnt = 0;
		for (int i = l; i <= r; ++i) sum += lsiz[s[i]];
		for (int i = l; i <= r; ++i) {
			cnt += lsiz[s[i]];
			if (2 * cnt >= sum) {
				rs(s[i]) = f(f, l, i - 1);
				ls(s[i]) = f(f, i + 1, r);
				if (ls(s[i])) fa[ls(s[i])] = s[i];
				if (rs(s[i])) fa[rs(s[i])] = s[i];
				update(s[i]);
				return s[i];
			}
		}
		return 0;
	}; int rt = calc(calc, 0, s.size() - 1);
	return rt;
}

链修改是好做的,但如果要维护子树信息就要维护考虑轻儿子的标记,比较麻烦,不如树剖(

标签:zson,return,int,ed,二叉树,平衡,now,全局,ls
From: https://www.cnblogs.com/wwlwakioi/p/17815881.html

相关文章

  • BindException、ConstraintViolationException、MethodArgumentNotValidException入参
    Springvalidation验证框架注解Springvalidation验证框架提供了大量接口入参检验注解,注意三个非空注解:@NotNull:验证对象是否不为null,无法查检长度为0的字符串@NotBlank:检查约束(字符串)是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格@NotEmpty:检查(集合)......
  • 线索二叉树(Morris Traversal)
    在前面的文章中总结了二叉树的一些操作,提供了二叉树前中后的递归和非递归的实现。在非递归的实现中,基本思想是利用栈来模拟递归调用遍历的过程,本质上和递归实现没有区别,空间复杂度为\(O(n)\)。是否存在一种算法,它不使用栈也不破坏二叉树结构,但是可以完成对二叉树的遍历?即:空间复......
  • C++禁用windows全局鼠标
    禁用全局鼠标的实现方式与禁用键盘类似,也是通过使用WindowsAPI函数来创建钩子来截取鼠标消息,然后在钩子函数中阻止特定鼠标事件的执行。下面是一个使用C++和WindowsAPI来禁用全局鼠标的示例代码:#include<iostream>#include<Windows.h>//定义全局的钩子句柄HHOOKmouseHook......
  • C++禁用windows全局键盘
    1.使用WindowsAPI函数调用来拦截键盘消息。2.创建一个键盘钩子来截取键盘消息。3.在钩子函数中,检测到特定按键事件时,阻止该事件执行。4.最终在程序退出时释放钩子。下面是一个使用C++和WindowsAPI来禁用Windows系统键盘的示例代码:#include<iostream>#include<Windows.h......
  • 如何平衡三维模型的顶层合并构建的文件大小与质量关系
    如何平衡三维模型的顶层合并构建的文件大小与质量关系 倾斜摄影超大场景的三维模型的顶层合并的数据文件大小与质量之间存在一定的关系。本文将对这种关系进行分析和总结。一、数据文件大小的影响因素数据分辨率:数据分辨率是影响数据文件大小的重要因素之一。通常情况下,分辨......
  • LeetCode222.完全二叉树的节点个数
    题目描述给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。示例提交的代......
  • 通过mybatis-plus的自定义拦截器实现控制 mybatis-plus的全局逻辑删除字段的控制 (修改
    需求:过滤部分请求不实现mybatis-plus的逻辑删除看到网上关于mybatis-plus的自定义拦截器的文章有的少想了想自己写了一篇欢迎参考指正通过springboot的拦截器在请求进来时标记需要实现的需求的逻辑importlombok.Data;@DatapublicclassSyncBo{privateBoolean......
  • 平衡子序列的最大和
    给你一个下标从0开始的整数数组nums。nums一个长度为k的子序列指的是选出k个下标i0<i1<...<ik-1,如果这个子序列满足以下条件,我们说它是平衡的:对于范围[1,k-1]内的所有j,nums[i]-nums[j]>=i-j都成立。nums长度为1的子序列是平衡的。请......
  • 二叉树理论基础
    二叉树理论基础二叉树的种类满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树二叉树的存储方式顺序存储、链式存储二叉树的遍历方式二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走。广度优先遍历:一层一层的去遍历。那么从深度优先遍历和广度优先......
  • 01_二叉树的递归遍历
    二叉树的递归遍历递归算法的三要素确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件:写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终......