zoukankan      html  css  js  c++  java
  • dsu on tree(树上启发式合并)

    其实已经做过很多道了,但自己直到现在才重视起来它

    以下大部分是看的洛谷日志:=w=

    它可以处理一些常见的树上问题:

    1.每个节点的答案是其子树的叠加,考虑利用这个性质处理问题

    2.就是你必须通过整个子树来更新自己当前节点的信息的这种题

    具体实现:

    先遍历其非重儿子,获取它的ans,但不保留遍历后它的check

    遍历它的重儿子,保留它的chec

    k再次遍历其非重儿子及其父亲,用重儿子的check对遍历到的节点进行计算,获取整棵子树的ans

    注意:

    1.为什么不合并第一步和第三步呢?因为check数组不能重复使用,否则空间会太大,需要在 O(n) 的空间内完成。

    时间复杂度:O(nlogn)

    优秀之处:可以水树套树的题和吊打树上莫队且常数小

    练习题

    CF600E Lomsat gelral(http://codeforces.com/problemset/problem/600/E)

    题意翻译:树的节点有颜色,一种颜色占领了一个子树,当且仅当没有其他颜色在这个子树中出现得比它多。求占领每个子树的所有颜色之和。

    UOJ284 快乐游戏鸡(http://uoj.ac/problem/284)

    参考资料/扩展阅读

    CF741D作者介绍的dsu on tree(http://codeforces.com/blog/entry/44351)

    这位作者的题解(http://codeforces.com/blog/entry/48871)

     

  • 相关阅读:
    __iter__方法demo
    开放封闭原则
    单例模式
    Python赋值、浅拷贝、深拷贝
    保留原页面的参数条件
    request.GET、request.POST、request.body(持续更新)
    面向对象的封装、继承、多态(持续更新)
    关于Form、ModelForm的一些操作(持续更新)
    创建类的两种方式
    Nginx深度优化
  • 原文地址:https://www.cnblogs.com/lkx422/p/11805428.html
Copyright © 2011-2022 走看看