划分树(算法总结)

合集下载

决策树很详细的算法介绍

决策树很详细的算法介绍

决策树很详细的算法介绍决策树(Decision Tree)是一种常用的机器学习算法,它模拟人类决策过程的思维方式,能够通过学习已有数据集建立一个树状模型,来进行分类和回归的预测。

它可以处理具有离散和连续属性的数据,并具有较好的可解释性和易于理解的特点。

本文将对决策树算法进行详细介绍。

一、决策树算法的基本原理决策树算法基于“分而治之”的思想,将复杂的问题分解为一系列简单的决策判断,从而构建一个树状模型。

决策树的根节点表示最初的决策,内部节点代表决策的中间过程,叶节点表示最终的决策结果。

决策树的构建过程包括特征选择、树的生成和剪枝三个步骤。

特征选择是决策树算法中非常重要的一步,目的是选择对结果预测有最大分类能力的特征作为划分标准。

经典的特征选择方法有信息增益(ID3)、增益比(C4.5)和基尼指数(CART)等。

信息增益以信息熵的减少量作为特征选择的标准,增益比在信息增益的基础上,对特征本身的信息熵做出惩罚,而基尼指数则衡量数据集的不确定性。

树的生成是决策树算法的核心部分,它可以通过递归地将训练数据划分为不同的子集,直到子集中的数据属于同一类别为止。

生成过程中,通过计算选择的特征对数据集进行划分,并将数据集按照该特征的取值划分为若干子集。

重复这个划分过程,直到每个子集中的数据都属于同一类别,或者没有更多的特征可以选择。

决策树的剪枝是为了防止过拟合现象的发生,过拟合指的是决策树建立过于复杂,过多地考虑了数据集的特殊噪声和异常情况,导致模型在测试数据上表现较差。

剪枝的目标是通过去掉一些分支来简化树模型,提高模型的泛化能力。

决策树剪枝算法有预剪枝和后剪枝两种方式,预剪枝在生成树的过程中进行剪枝,后剪枝在生成树之后进行剪枝。

二、决策树的优势和不足决策树算法具有以下优势:1.决策树易于理解和解释,生成的规则形式直观,能够为决策提供明确的解释。

2.决策树算法是一种非参数方法,对数据的分布没有假设,适用于各种类型的数据。

分治算法在树的路径问题中的应用

分治算法在树的路径问题中的应用

1
IOI目录】
【序言】........................................................................................................................ 3 【正文】........................................................................................................................ 4 一.树的分治算法.................................................................................................... 4 基于点的分治:.............................................................................................. 4 基于边的分治:.............................................................................................. 4 效率分析:...................................................................................................... 5 【例 1】树中点对统计................................................................................... 8 算法分析................................................................................................... 8 【例 2】Free Tour 2 ...................................................................................... 10 算法分析................................................................................................. 10 【本节小结】................................................................................................ 13 二.树的路径剖分算法:................................................................................... 14 【例 3】Query On a Tree.............................................................................. 14 算法分析................................................................................................. 14 引入路径剖分......................................................................................... 14 轻重边路径剖分..................................................................................... 15 【例 4】黑白树 ........................................................................................... 17 算法分析................................................................................................. 17 【小结】........................................................................................................ 18 路径剖分与树的分治的联系:.................................................................... 19 【例 5】Query On a Tree Ⅳ ........................................................................ 20 算法分析................................................................................................. 20 【本节小结】................................................................................................ 23 三.树的分治的进一步探讨:........................................................................... 24 如何改进基于边的分治的时间复杂度........................................................ 24 使用基于边的分治解决【例 2】................................................................. 26 使用基于边的分治解决【例 5】................................................................. 27 四.全文总结....................................................................................................... 28 【参考文献】.............................................................................................................. 29 【感谢】...................................................................................................................... 29 【附录】...................................................................................................................... 29

leetcode树算法总结

leetcode树算法总结

LeetCode树算法总结1. 简介LeetCode是一个在线编程平台,提供了大量的算法题目用于练习和学习。

树是其中一个重要的数据结构,在LeetCode上有很多与树相关的算法题目。

本文将对LeetCode树算法进行全面总结,包括重要观点、关键发现和进一步思考。

2. 树的基础知识在深入讨论LeetCode树算法之前,我们先回顾一下树的基础知识。

2.1 树的定义树是一种非线性的数据结构,由节点和边组成。

每个节点可以有多个子节点,但只能有一个父节点(除了根节点)。

没有父节点的节点称为根节点,没有子节点的节点称为叶子节点。

2.2 二叉树二叉树是一种特殊的树,每个节点最多只能有两个子节点。

这两个子节点分别称为左子节点和右子节点。

2.3 二叉搜索树(BST)二叉搜索树是一种特殊的二叉树,满足以下条件: - 左子树所有值小于等于当前节点值 - 右子树所有值大于等于当前节点值 - 左右子树也都是二叉搜索树二叉搜索树的一个重要性质是,对于任意节点,它的左子树中的所有节点值都小于它,右子树中的所有节点值都大于它。

这个性质使得在二叉搜索树中进行查找、插入和删除操作非常高效。

2.4 二叉树的遍历在LeetCode树算法中,经常需要对二叉树进行遍历。

常见的遍历方式有三种:前序遍历、中序遍历和后序遍历。

•前序遍历(Preorder Traversal):先访问当前节点,然后递归地访问左子树和右子树。

•中序遍历(Inorder Traversal):先递归地访问左子树,然后访问当前节点,最后递归地访问右子树。

•后序遍历(Postorder Traversal):先递归地访问左子树和右子树,然后访问当前节点。

3. 树算法题目分类LeetCode上的树算法题目可以分为以下几个类别:3.1 根到叶子节点路径问题这类问题要求从根节点到叶子节点的路径上找出满足某种条件的路径。

通常使用深度优先搜索(DFS)来解决。

例题:路径总和(Path Sum)给定一个二叉树和一个目标值,判断是否存在从根节点到叶子节点的路径上的节点值之和等于目标值。

kd树和BBF算法

kd树和BBF算法

d ( x, y ) ( x1 y1 ) 2 ( x2 y2 ) 2 ... ( xn yn ) 2
二、什么是K-D 树
Kd-树是K-dimension tree的缩写,是对数据点在k维 空间(如二维(x,y),三维(x,y,z),k维(x1,y,z..)) 中划分的一种数据结构,主要应用于多维空间关键数据 的搜索(如:范围搜索和最近邻搜索)。本质上说, Kd-树就是一种平衡二叉树。 k-d树也可以理解为一种空间划分树,就是把整个空间 划分为特定的几个部分,然后在特定空间的部分内进行 相关搜索操作。想像一个三维(多维很难想象)空间,kd 树按照一定的划分规则把这个三维空间划分了多个空间, 如下图所示:
构建结果如下图所示:
二、查询K-D 树
输入:构造的kd树,目标点x; 输出:x 的最近邻 算法步骤如下: 1.在kd树中找出包含目标点x的叶结点:从根结点出发,递归 地向下搜索kd树。若目标点x当前维的坐标小于切分点当前维 的坐标,则移动到左子结点,否则移动到右子结点,直到子结 点为叶结点为止。在整个查询过程中一直有一个不断更新优先 级队列。 2.对查询到的叶子结点做边界重叠球测试,以判断是否还需要 继续搜索。具体做法是:判断分隔那些记录的几何边界与以查 询点为中心,以当前最近点为半径的圆或超球体是否相交,若 相交则递归的查询其兄弟结点,若不相交则回溯。 3.当回退到根结点时,搜索结束,最后的更新的最近邻即为x 的最近邻点。
举个例子如查找点为(2,4.5),具体步骤依次如下:
1.首先从根结点(7,2)开始查询,因为根结点是从第一维开始划分的, 所以拿查询点的第一维2与7比较,显然2<7,所以进入(7,2)的左子结 点(5,4)进行查询,同理因为(5,4)结点是按照第二维划分的,所 以拿查询点的第二维4.5 与4比较,显然4.5>4,所以进入(5,4)的右 子结点(4,7)查询。 2.当查询到(4,7)时发现此节点为叶子结点,进行“边界重叠球测 试”,此时是以(2,4.5)为圆心,以(2,4.5)到(5,4)的距离为 半径画圆,发现(4,7)结点与分割该子文件的边界y = 4 相交,则需 要继续对其兄弟结点(2,3)进行查询,此时则更新到最近点(2,3)。 3.按照向下查找的路径向上回溯,每个结点都进行“边界重叠球测试”, 重复上一步。

数据结构树的知识点总结

数据结构树的知识点总结

数据结构树的知识点总结一、树的基本概念。

1. 树的定义。

- 树是n(n ≥ 0)个结点的有限集。

当n = 0时,称为空树。

在任意一棵非空树中:- 有且仅有一个特定的称为根(root)的结点。

- 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每个集合本身又是一棵树,并且称为根的子树(sub - tree)。

2. 结点的度、树的度。

- 结点的度:结点拥有的子树个数称为结点的度。

- 树的度:树内各结点的度的最大值称为树的度。

3. 叶子结点(终端结点)和分支结点(非终端结点)- 叶子结点:度为0的结点称为叶子结点或终端结点。

- 分支结点:度不为0的结点称为分支结点或非终端结点。

- 除根结点之外,分支结点也称为内部结点。

4. 树的深度(高度)- 树的层次从根开始定义起,根为第1层,根的子结点为第2层,以此类推。

树中结点的最大层次称为树的深度(或高度)。

二、二叉树。

1. 二叉树的定义。

- 二叉树是n(n ≥ 0)个结点的有限集合:- 或者为空二叉树,即n = 0。

- 或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

2. 二叉树的特点。

- 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。

- 二叉树的子树有左右之分,次序不能颠倒。

3. 特殊的二叉树。

- 满二叉树。

- 一棵深度为k且有2^k - 1个结点的二叉树称为满二叉树。

满二叉树的特点是每一层上的结点数都是最大结点数。

- 完全二叉树。

- 深度为k的、有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。

完全二叉树的叶子结点只可能在层次最大的两层上出现;对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子。

三、二叉树的存储结构。

1. 顺序存储结构。

- 二叉树的顺序存储结构就是用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。

树分解定理

树分解定理

树分解定理树分解定理(Tree decomposition theorem)是离散数学中一项重要的定理,它与图的分解和图的算法密切相关。

树分解定理描述了任意图都可以根据其边集的某个树分解表达。

首先,我们来介绍一下树分解的概念。

树分解是对一个无向图进行分解的一种方法。

给定一个无向图G=(V,E),其中V表示图的顶点集,E表示图的边集。

树分解是将图G分解成一些子图的集合,这些子图采用树的结构组织,且满足如下条件:1. 每个子图都是图G的子图。

2. 每个顶点都属于一个或多个子图。

3. 任意两个子图之间要么没有公共顶点,要么有且只有一个公共顶点。

根据树分解的定义,我们可以得到一个关键结论:每个子图都可以用一个包含该子图所有顶点的集合作为标记。

这就是树分解的核心思想。

树分解定理指出,对于任意的无向图G=(V,E),存在一个树分解{(B_x, X_x)},其中B_x是一个子图,X_x是子图B_x的标记集合,满足以下三个条件:1. 图G的每个顶点都属于某个子图,即图G中所有的顶点在树分解的所有子图的标记集合中都有。

2. 图G的每条边都关联于某个子图,即图G中所有的边连接的顶点在树分解的某两个子图的标记集合中都有。

3. 任意的顶点v在树分解的所有子图中的标记集合的交集,称为顶点v的袋,即B_v = ∩{X_x|v∈X_x}。

树分解的每个子图袋的大小要小于等于某个常数k,即B_x ≤ k。

树分解定理的证明非常复杂,可以依靠递归的方法得到。

首先,我们定义以v为根的子图B_v和相应的标记集合X_v。

然后,我们选择树G的深度最大的顶点u,将其从图中删除并得到一个新的图G'。

此时,原图G的每个顶点都属于G'的一个子图,并形成一个包含u的袋B_u。

我们再次选择G'中深度最大的顶点,重复上述操作,直到最后得到只包含一个顶点并且没有边的子图。

这样就得到了一个树分解。

树分解的主要应用领域是图算法和计算理论。

分枝定界

常用算法大全-分枝定界任何美好的事情都有结束的时候。

现在我们学习的是本书的最后一章。

幸运的是,本章用到的大部分概念在前面各章中已作了介绍。

类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构是第1 6章所介绍的子集树和排列树)。

然而与回溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先或最小耗费方法来搜索这些树。

本章与第1 6章所考察的应用完全相同,因此,可以很容易比较回溯法与分枝定界法的异同。

相对而言,分枝定界算法的解空间比回溯法大得多,因此当内存容量有限时,回溯法成功的可能性更大。

5.1 算法思想分枝定界(branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对E-节点的扩充方式。

每个活节点有且仅有一次机会变成E-节点。

当一个节点变为E-节点时,则生成从该节点移动一步即可到达的所有新节点。

在生成的节点中,抛弃那些不可能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一个E-节点。

从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才结束。

有两种常用的方法可用来选择下一个E-节点(虽然也可能存在其他的方法):1) 先进先出(F I F O)即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活节点表的性质与队列相同。

2) 最小耗费或最大收益法在这种模式中,每个节点都有一个对应的耗费或收益。

如果查找一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个E-节点就是具有最小耗费的活节点;如果希望搜索一个具有最大收益的解,则可用最大堆来构造活节点表,下一个E-节点是具有最大收益的活节点。

例5-1 [迷宫老鼠] 考察图16-3a 给出的迷宫老鼠例子和图1 6 - 1的解空间结构。

使用F I F O 分枝定界,初始时取(1,1)作为E-节点且活动队列为空。

迷宫的位置( 1 , 1)被置为1,以免再次返回到这个位置。

算法合集之《浅析树的划分问题》

浅析树的划分问题东北育才学校贝小辉【摘要】树的最大-最小划分问题可以表述为如下形式:给定一棵n个节点的树以及每个节点的一个非负权值,要求将这棵树划分为k棵子树,使得子树中所有节点权值和的最小值最大。

将原问题转化为对于给定下界,划分最多子树的问题,并通过对新问题的解决结合二分法来解决原问题是可行的,但是算法的总复杂度要依赖于节点权值的范围。

本文接下来介绍了一个时间复杂度不依赖于节点权值范围的算法,随后通过对算法的描述、正确性的证明来进一步探讨算法的特点,并介绍了算法的一些扩展,最后总结了两个算法各自的特点。

【关键字】问题转化,割,移动,上方【正文】树的划分问题是图论中的一类范围非常广泛的问题,这类题目的大意就是将给定的一棵树划分为若干棵子树,使其能够满足一定的条件或是使得某个特定的函数达到最值。

如今,这类问题已被扩展出了各式各样的问题,并在很多领域都有着很广泛的应用。

本文所要着重探讨的,是其中一种被称为最大-最小划分的问题。

一、问题的提出草莓(NOI2003 Day 2-2 berry test6~test9)题目大意:给出一片草莓中每个草莓的重量以及它们的连接情况。

定义:sum(i)表示第i块草莓田中所有草莓重量的和(1<= i <= k),x = min{ sum(i) | 1<= i <=k }。

你的任务就是要把一块草莓田分割成k块,且分割方案需要满足如下的条件:·每一块中的草莓必然是直接或者间接的和其他草莓相连接的;·这种分割方案所对应的x尽可能的大。

最后输出你的分割方案和结果。

这是一道提交答案式的题目,其中第6个数据至第9个数据所给的图是一棵树,若不考虑具体的数据情况,我们可以将原问题抽象成如下问题:给定一棵树以及树中每个顶点的一个非负权值,将树划分为k棵子树,定义:sum(i)表示第i棵子树中所有节点权值的和,x = min{ sum(i) | 1<= i <=k },请求出x的最大值并输出此时的划分方案。

四叉树八叉树BSP树与KD树

四叉树, 八叉树, BSP 树与 KD 树-- 空间数据的划分与查找内容•四叉树(Quadtree)•八叉树(Octree)•二叉空间划分树(BSP tree)•KD 树(K Dimensional tree)问题:1维空间数据查找•1维数组int a[] = {35, 17, 39, 9, 28, 65, 56, 87};•实现bool find(int a[], int val);•顺序查找,时间复杂度 O(N)•二分查找,时间复杂度 O(logN);排序复杂度 O(N * logN)•如果要查询 k 次?•如果 a[] 中的数据允许插入、删除?顺序查找 & 二分查找二叉查找树(Binary Search Tree)•对原始数据按照一定规则进行组织、划分:•左子树上所有节点的值小于根节点的值•右子树上所有节点的值大于根节点的值•左、右子树都各是一棵 BST•时间复杂度:•建树 O(N * logN),插入 O(logN),删除 O(logN),查找 O(logN)•空间复杂度:O(N)二叉查找树例子演示/bst.html问题:2维空间数据查找•2维平面上有 1000 个点,vector<Point2> points = {...};•实现bool find(vector<Point2> &points, Point2 p);•暴力查找,时间复杂度 O(N)•空间换时间,假设所有点都在 1000 * 1000 的 2D 网格上,用一个二维数组记录每个网格点是否有点,时间复杂度 O(1),空间复杂度 O(1000 * 1000)•四叉树(Point Quadtree),即二维数据情况下的 BST内容•四叉树(Quadtree)•八叉树(Octree)•二叉空间划分树(BSP tree)•KD 树(K Dimensional tree)四叉树•四叉树是一种树形数据结构,其每个节点至多有四个子节点,表示将当前空间划分为四个子空间,如此递归下去,直到达到一定深度或者满足某种要求后停止划分。

离散数学第九章树知识点总结


生成树的存在性 定理 任何无向连通图都有生成树. 证 用破圈法. 若图中无圈, 则图本身就是自己的生成树.
否则删去圈上的任一条边, 这不破坏连通性, 重复进行 直到无圈为止,剩下的图是一棵生成树. 推论 1 设 n 阶无向连通图有 m 条边, 则 mn1. 推论 2 设 n 阶无向连通图有 m 条边, 则它的生成树的余树 有 mn+1 条边.
{0,10,010, 1010} 不是前缀码
例 在通信中,设八进制数字出现的频率如下:
0:25%
1:20%
2:15%
3:10%
4:10%
5:10%6:5% Nhomakorabea7:5%
采用 2 元前缀码, 求传输数字最少的 2 元前缀码 (称作最佳前
缀码), 并求传输 10n(n2)个按上述比例出现的八进制数字需
要多少个二进制数字?若用等长的 (长为 3) 的码字传输需要
推论 3 设
为 G 的生成树 T 的余树,C 为 G 中任意一个
圈,则 C 与
一定有公共边.
基本回路与基本回路系统
定义 设 T 是 n 阶 m 条边的无向连通图 G 的一棵生成 树,设 e1, e2, … , emn+1 为 T 的弦. 设 Cr 为 T 添加弦 er 产生的 G 中惟一的圈(由 er和树枝组成), 称 Cr 为对应 弦 er的基本回路或基本圈, r=1, 2, …, mn+1. 称{C1, C2, …, Cmn+1}为对应 T 的基本回路系统. 求基本回路的算法: 设弦 e=(u,v), 先求 T 中 u 到 v 的路径 uv, 再并上弦 e, 即得对应 e 的基本回路. 基本割集与基本割集系统定义 设 T 是 n 阶连通图 G 的一棵生成树, e1, e2, …, en1 为 T 的树枝,Si 是 G 的只含树枝 ei, 其他边都是弦
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态求解区间最大数的问题揭开它神秘的面纱,探寻真理的奥妙。

——小志。

这偏文章主要总结划分树解决区间第K大数的问题。

一些内容并非原创,全部内容只供参考交流!
划分树
●划分树的定义
划分树定义为,她的每一个节点保存区间lft,rht所有元素,元素排列顺序与原数组(输入)相同,但是,两个子树的元素为该节点所有元素排序后rht−lft+1 / 2个进入左子树,其余的到右子树,同时维护一个num域,num[i]表示lft→i 这些点有多少进入了左子树。

(摘自某牛人的博客,为了和下面的算法统一,稍有变动)
●划分树的Sample.
如果由下而上看这个图,我们就会发现他和归并排序的(归并树)的过程很类似,或者说正好相反。

归并树是由下而上的排序,而她确
实由上而下的排序(观察‘4’
的运动轨迹,我们可以猜到,
划分树的排序也是一种稳
定的排序方法,这里不是说
明的重点,不予证明)。


这正是她可以用来解决第
k大元素的理由所在。

(具体
的理由,写完再补)
●划分树的存储结构(采用层次存储结构(由下而上,由左到右,每层两个孩子,见上图)
using namespace std;
#define M 100001
#define md(x, y) (((x)+(y))>>1)
int sorted[M]; // 对原来集合中的元素排序后的值。

struct node {
int val[M]; // val记录第k层当前位置的元素的值
int num[M]; // num记录元素所在区间的当前位置之前进入左孩子的个数
double sum[M]; // sum记录比当前元素小的元素的和。

}t[20];
●划分树的建立Build
划分树的建立和普通的二叉树的建立过程差不多,仍然采取中序的过程(先根节点,然后左右孩子)。

树的建立相对比较简单,我们依据的是已经排好序的位置进行建树,所以先用快排将原集合牌还序。

要维护每个节点的num域。

void build(int lft, int rht, int p) {
if(lft == rht) return;
int i, mid = md(lft, rht);
int isame = mid - lft + 1, same = 0;
/* isame用来标记和中间值val_mid 相等的,且分到左孩子的数的个数。

初始时,假定当前区间[lft,rht]有mid-lft+1个和val_mid 相等。

先踢掉比中间值小的,剩下的就是要插入到左边的*/
for(i = lft; i <= rht; i++)
if(t[p].val[i] < sorted[mid]) isame--;
int ln = lft, rn = mid + 1;
for(i = lft; i <= rht; i++) {
if(i == lft) { // 初始一个子树。

t[p].num[i] = 0;
t[p].sum[i] = 0;
} else { // 初始区间下一个节点。

t[p].num[i] = t[p].num[i-1];
t[p].sum[i] = t[p].sum[i-1];
}
/* 如果大于,肯定进入右孩子,否则,判断是否还有相等的应该进入左孩子的,没有,就直接进入右孩子,否则进入左孩子,同时更新节点的sum域和num域*/
if(t[p].val[i] < sorted[mid]) {
t[p].num[i]++;
t[p].sum[i] += t[p].val[i];
t[p+1].val[ln++] = t[p].val[i];
}else if(t[p].val[i] > sorted[mid]) {
t[p+1].val[rn++] = t[p].val[i];
}else {
if(same < isame) {
same++;
t[p].num[i]++;
t[p].sum[i] += t[p].val[i];
t[p+1].val[ln++] = t[p].val[i];
}else {
t[p+1].val[rn++] = t[p].val[i];
}
}
}
build(lft, mid, p+1);
build(mid+1, rht, p+1);
}划分树的查找
在区间[a,b]上查找第k大的元素,同时返回她的位置和去见里面小于[a, b]的所有数的和。

1.如果t[p].num b−t[p]. num a−1≥k, 即,进入p的左孩子的个数已经超过k个,那么就往左孩子里
面查找,同时更新{a,b}==>{lft+t p.num a−1,,lft+t p.num b− 1}
2.如果t p.num b−t p. num a−1<k, 即,进入p的左孩子的个数小于k个,那么就要往右孩子查找
第k – s (s表示进入左孩子的个数)个元素。

同时要更新sun域。

3.详细的过程见代码和注释:
/* 在区间[a, b]上查找第k大元素,同时Sum返回区间[a, b]中小于第k大元素的和。

*/ double Sum = 0;
int query(int a, int b, int k, int p, int lft, int rht) {
if(lft == rht) return t[p].val[a];
/* 到达叶子就找到该元素,返回。

s 记录区间[a, b]中进入左孩子的元素的个数。

ss 记录区间[lft, a-1)中计入左孩子的元素的个数。

sss记录区间[a, b]中小于第k大元素的值的和。

b2 表示[lft, a-1]中分到右孩子的个数
bb 表示[a, b] 中分到右孩子的个数。

*/
int s, ss, b2, bb, mid = md(lft, rht); double sss;
//区间端点点重合的情况, num[a] 不一定为,所以要单独考虑
if(a == lft) {
s = t[p].num[b];
ss = 0;
sss = t[p].sum[b];
} else {
s = t[p].num[b] - t[p].num[a-1];
ss = t[p].num[a-1];
sss = t[p].sum[b] - t[p].sum[a-1];
}
if(s >= k) { // 进入左孩子,同时更新区间端点值。

a = lft + ss;
b = lft + ss + s - 1;
return query(a, b, k, p+1, lft, mid);
} else {
bb = a - lft - ss;
b2 = b - a - 1 - s;
a = mid + b
b + 1;
b = mid + bb + b2;
Sum += sss;
return query(a, b, k-s,p+1, mid+1, lft);
}
}
划分树的应用
pku_2401_K-th Number
hdu_2665_Kth number
前两个是基础,后一个是上面所得带sum域的加强版。

hdu_3743_Minium_Number。

相关文档
最新文档