树形结构转线形结构——树链剖分——子树问题

昨天遇到了这样一道题目:                一个公司有 n 个员工,编号从 0  到 n-1 ,每个员工都有一个直系上司,编号为 0 的是整个公司的董事长(包工头),现在,给出每个员工每月的初始工资,为了鼓励最佳员工和最佳部门,现在,董事会会有以下两种询问:                1、employee x y z :询问员工 x 的工资,如果员工的 x 的工资小于 y
摘要由CSDN通过智能技术生成

        昨天遇到了这样一道题目:

                一个公司有 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 的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值