OSDN Git Service

fix bugs
authorsshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:46:35 +0000 (21:46 +0800)
committersshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:46:35 +0000 (21:46 +0800)
docs/ds/cartesian-tree.md

index 867dc9d..6103367 100644 (file)
@@ -53,7 +53,7 @@ HDU 1506 最大子矩形
 
 这道题你可 DP,可单调栈,但你万万没想到的是它也可以笛卡尔树!具体地,我们把下标作为键值 $k$ , $h_i$ 作为键值 $w$ 满足小根堆性质,构建一棵 $(i,h_i)$ 的笛卡尔树。
 
-这样我们枚举每个结点 $u$ ,把 $u_w$ (即结点 u 的高度键值 $h$ )作为最大子矩阵的高度。由于我们建立的笛卡尔树满足小根堆性质,因此 $u$ 的子树内的结点的高度都大于等于 $u$ 。而我们又知道 $u$ 子树内的下标是一段连续的区间。于是我们只需要知道子树内的下标最小值和最大值即可,换言之,就是 $u$ 子树内的左链和右链末端的结点的下标键值。我们对每个点这样求,最后取面积最大值即可。显然这个可以一次 DFS 完成,因此复杂度仍是 $O(n)$ 的。
+这样我们枚举每个结点 $u$ ,把 $u_w$ (即结点 u 的高度键值 $h$ )作为最大子矩阵的高度。由于我们建立的笛卡尔树满足小根堆性质,因此 $u$ 的子树内的结点的高度都大于等于 $u$ 。而我们又知道 $u$ 子树内的下标是一段连续的区间。于是我们只需要知道子树的大小,然后就可以算这个区间的最大子矩阵的面积了。用每一个点计算出来的值更新答案即可。显然这个可以一次 DFS 完成,因此复杂度仍是 $O(n)$ 的。
 
 ```cpp
 #include <algorithm>