有道题要搞一个如题所示的东西,但是有些细节实现不太懂,想问一下如何实现。
大概思路:有一个 N∗M 的棋盘,每个格子里有数。构造方式是从大到小枚举,每个点依次相连。如果把空间分割成多个部分,则每个部分代表一棵子树,分别相连。
例子:
5 & 8 & 4\\
9 & 3 & 7\\
2 & 6 & 1
\end{vmatrix}
构建出来的二维笛卡尔树:
9→8→7→6→3→2→1→4→5
可见它的构建过程十分麻烦,尚未想出线性构造方法,只想到一个 NMlog2Nlog2M 的做法:
定义函数里存了所有当前连通块的点,枚举到一个点时并查集连周围8个方向曾经访问过的点。如果周围方向里面有相同的就开始分裂。启发式分裂分离出比较小的。但是具体的实现过程不太会,不会启发式复杂度地判断出要分离的点。另外分裂的时候枚举顺序数组也要分裂,还要增加一个 log。
综上,想问启发式分裂的实现过程和更低复杂度的做法。