《二维笛卡尔树》
  • 板块学术版
  • 楼主hbhz_zcy
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/28 14:30
  • 上次更新2023/10/24 06:20:03
查看原帖
《二维笛卡尔树》
142549
hbhz_zcy楼主2022/12/28 14:30

有道题要搞一个如题所示的东西,但是有些细节实现不太懂,想问一下如何实现。
大概思路:有一个 NMN \ast M 的棋盘,每个格子里有数。构造方式是从大到小枚举,每个点依次相连。如果把空间分割成多个部分,则每个部分代表一棵子树,分别相连。
例子:

5 & 8 & 4\\ 9 & 3 & 7\\ 2 & 6 & 1 \end{vmatrix}

构建出来的二维笛卡尔树:
987632145\large{9\to8^{\to5}_{\to7^{\to4}_{\to6^{\to1}_{^{\to2}_{\to3}}}}}

可见它的构建过程十分麻烦,尚未想出线性构造方法,只想到一个 NMlog2Nlog2MNMlog^2Nlog^2M 的做法:
定义函数里存了所有当前连通块的点,枚举到一个点时并查集连周围8个方向曾经访问过的点。如果周围方向里面有相同的就开始分裂。启发式分裂分离出比较小的。但是具体的实现过程不太会,不会启发式复杂度地判断出要分离的点。另外分裂的时候枚举顺序数组也要分裂,还要增加一个 log\log

综上,想问启发式分裂的实现过程和更低复杂度的做法。

2022/12/28 14:30
加载中...