Box HDU - 2475 (Splay 维护森林)
Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作。 操作 \(1\) :把 \(x\) 的箱子及里面的箱子一块挪到 \(y\) 箱子里面去。 操作 \(2\) :查询 \(x\) 箱子的最外层的箱子编号。 思路 对于每一大块箱子,可以看成树和子树的包含关系,那么可以根据树的 \(dfs\) 序,把一个箱子所包含的箱子拍成一个区间,这样就变成了很多颗树。为了方便后面的操作,对于每个箱子 \(x\) 所包含的区间,用标号 \(x\) 来表示开始的位置, \(x+n\) 来表示结束的位置。 使用 \(splay\) 维护每多颗树的 \(dfs\) 序。由于每棵树都有一个自己的 \(root\) 节点,我们让他们的 \(root\) 节点统一连向 \(0\) 这个虚点。 再来看一看操作,操作 \(1\) 可以变成删除操作以及区间移动操作。操作 \(2\) 就是普通的查询操作。 对于操作 \(1\) ,先找到 \(x\) 和 \(x+n\) 所在的位置,把 \(x\) \(splay\) 到其树的 \(root\) 上,把 \(x+n\) \(slay\) 到 \(x\) 的右子树上,那么我们要转移的树就是 \(x->x+n->x+n\) 的所有左子树。 同样的