昨天遇到了这样一道题目:
一个公司有 n 个员工,编号从 0 到 n-1 ,每个员工都有一个直系上司,编号为 0 的是整个公司的董事长(包工头),现在,给出每个员工每月的初始工资,为了鼓励最佳员工和最佳部门,现在,董事会会有以下两种询问:
1、employee x y z :询问员工 x 的工资,如果员工的 x 的工资小于 y ,那么就给他(她)涨 z 元
2、department x y z :询问员工 x 领导的部门的平均工资,如果平均工资小于 y ,那么就给这个部门的每个员工涨 z 元
当时一看到题目就知道是树链剖分,对于树链剖分我只知道个大概,队友给我讲了他的做法,但是没有听明白,最后还是没有在比赛期间做出来,感觉甚是可惜,深感以后决不能再因为这样挂题,于是昨天晚上还有今天一直在恶补树链剖分,只是搞懂了一些简单的问题,现在总结一下。
这样的题目,只是涉及到节点和子树的问题,并不涉及到对树上的路径进行操作,显得要简单一点。
为了深刻的理解树链剖分,我们的首先来看一下树的遍历,这里指的是DFS
在遍历的时候,假定我们给每一个遍历的节点一个从小到大的编号,这样的编号有什么特点呢?我们来看一下:
现在假定我们有上面一颗树:整棵树的根是 1 ,我们从根节点遍历,遍历的方式利用 先根遍历 ,1 节点的编号是 1 ,然后遍历的时候遇到一个新的节点,序号就 +1,这样,我们不难得到以下的序号:
节点 :1 2 4 5 8 9 6 3 7
节点序号:1 2 3 4 5 6 7 8 9
得到这个表格有什么用呢?
我们仔细观察一下:
节点 1 是整棵树的根,节点 1 的序号是整棵树的节点里面序号最小的,并且,以节点 1 的为根的数的节点的序号全部是紧接着着节点 1 的序号的
节点 2 是子树(2 4 5 6 8 9)的根,节点 2 的序号是以节点 2 为根的树中节点序号最小的,并且,以节点 2 为根的子树的节点的序号全部是紧接着节点 2 的
节点 5 是子树(5 8 9)的根,节点 5 的序号是以节点 5 为根的树中节点序号最小的,并且,以节点 5 为根的子树的节点的序号全部是紧接着节点 5 的