随记 – 二月四日 – 将树形结构序列化的几种办法

DFS序列(dfn\mathrm{dfn}

在没有或存在一定限制条件的情况下,以DFS遍历经过的节点顺序构成的序列。记dfn(x)\mathrm{dfn}(x)为第一次访问该节点的时间戳,seq(t)\mathrm{seq}(t)为访问序为tt的节点。

容易发现,节点xx的子树节点的dfn\mathrm{dfn}一定是一段连续的区间。故我们可以使用数据结构方便地维护子树的信息。

欧拉序

和DFS序不同,欧拉序在每个节点开始/结束访问时均会被记录一次,故该序列的长度为2n2nnn为节点数。例如,对于下面这棵树,一个合法的欧拉序是0,2,3,3,4,1,1,4,2,0{0, 2, 3, 3, 4, 1, 1, 4, 2, 0}

记序列为seq\mathrm{seq},每个节点开始访问的时间戳为st(x)\mathrm{st}(x),结束访问的时间戳为ed(x)\mathrm{ed}(x),有seq(st(x))=seq(ed(x))=x\mathrm{seq}(\mathrm{st}(x))=\mathrm{seq}(\mathrm{ed}(x))=x。则st(4)=5\mathrm{st}(4)=5ed(4)=8\mathrm{ed}(4)=8

欧拉序可以处理路径上的问题。考虑xyx \leftrightarrow y的简单路径,它可以被看做欧拉序上连续的一段。我们取序列中的这些元素:

seq(t),t{[st(x),st(y)],xy存在“祖先 – 儿子”关系,且设xy的父亲[ed(x),st(y)],其他情况,并令st(x)<st(y)\mathrm{seq}(t), t \in \begin{cases}[\mathrm{st}(x), \mathrm{st}(y)], & \text{当}x\text{和}y\text{存在“祖先 – 儿子”关系},\text{且设}x\text{是}y\text{的父亲}\\ [\mathrm{ed}(x), \mathrm{st}(y)], & \text{其他情况,并令}\mathrm{st}(x)<\mathrm{st}(y) \end{cases}

若同一个节点在该区间中出现了22次,说明在xyx \leftrightarrow y的简单路径上不存在该节点,不统计其信息,否则作统计。还需要注意,当x,yx, y互不为祖先时,其lca\mathrm{lca}不会出现在子区间中(参看欧拉序的定义),需要额外统计。

它往往与根号分治、分块、莫队等算法有机结合,处理树上路径的询问。[WC2013] 糖果公园是其经典应用。

树链剖分

点击小标题出门右转OI Wiki。

  • 2022年2月4日