码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 树链剖分练习


    树链剖分

    将树上区间问题转化为log N个区间问题。

    重链剖分的概念和写法

    定义:把点划分到链里面去,一般不包含折着的链条,一般是根节点向下,或者是祖先向下。

    剖分类型:长链剖分、重链剖分。剖分就是每个节点找一个儿子连下去,然后就不会形成分叉,就是链条;其余用虚线连接。长链剖分是找最深的儿子,重链剖分是size最大的。

    性质:经过轻边,子树大小翻倍。最多经过logn条轻边,logn段重边,每一段有很多条。

    剖分步骤:第一次dfs找出节点的父亲、重儿子、深度、大小。第二次dfs标记时间戳,当前借点所在的重链的头是谁,头的头是自己。

    (树剖LCA/板子)

    【模板】轻重链剖分/树链剖分

    P3384【模板】轻重链剖分/树链剖分

    维护最短路径和,最短路径加,子树和,子树加。

    code

    [ZJOI2008]树的统计

    树的统计

    维护树上单点改值,路径求和,路径上最大权值。

    好久没写线段树了,le,ri,s,t值赋反了。

    细节:一般线段树下标是a的下标,直接赋值a[i]即可。树剖里,线段树下标是dfn值,不能直接摆a[l],应该赋值a[id[i]]。id[i]保存的是dfn值为 i 的节点。给线段树相关函数传值时,传入的le,ri也不是下标,而是dfn,其他照旧写。

    code

    [SDOI2011]染色

    染色

    树剖+线段树。维护区间左右边的值,段数。合并顺序。

    合并过程要注意顺序,[le…ri] <- 线段树上查到的 + [le…ri] <- 现在的.非常的怪,但这是有迹可循的,线段树的下标是dfn,重链是连续的dfn,[l[top[v]],l[v]]区间内是连续的,为一条重链。如果u,v没有在一条链上,下一个查询的区间就是[l[top[fa[top[v]]]],l[fa[top[v]]]],这是下一条链的dfn区间.区间内一定是连续的,但是这两个区间在线段树上不一定连续,但一定 l[fa[top[v]]] < l[top[v]],也就是下一个区间在当前区间的左边。区间有左右顺序,而维护内容跟区间左右又相关,自然要按照上述的规则合并。

    查到最后会变成"八"字形,左边或者右边高一点,高出来的部分是找到的公共链。会变成[ri…le] + [le…ri],任意翻转一个区间变成 [ri…le] + [ri…le] 或者 [le…ri] + [le…ri] 再合并最后一次即可。

    code

    [USACO15DEC]Max Flow P

    Max Flow P

    树剖+线段树。维护区间最大值,加法tag。

    code

    [NOI2015] 软件包管理器

    软件包管理器

    树剖+线段树。维护区间个数。

    一开始写错了,写成modify(u, id[r[u]], 1);了,这是改一条路径上的值。正确写法就是modify(l[u], r[u], 1, n, 1, 1);,直接把其子树全部改掉。

    code

    Can you answer these queries VII

    SP6779 GSS7 - Can you answer these queries VII

    树剖+线段树。查找链上连续的最大字段和,之前有一道线段树题也是这个,只不过这题套了树剖。坑:字段可以为空(0)。这题跟染色差不多,合并要注意左右顺序。

    最大子段和的求法类似于归并,(左最大后缀 + 右最大前缀) 或者 (左最大子段值) 或者 (右最大子段值),三者取最大。settag时,如果是正数,val内所有元素应该等于区间总和。

    code

  • 相关阅读:
    探讨下如何更好的使用缓存 —— 集中式缓存Redis的BitMap存储、管道与事务、以及与本地缓存一起构建多级缓存
    LeetCode刷题笔记之图论
    Spring Boot集成SpringFox 3.0与Pageable参数处理
    EF Core 7.0 新特性之批量修改
    微信小程序开发16 内容加速:如何借助云存储实现无缝上云?
    git pull and git fetch 到底有什么区别?
    电脑如何激活windows
    R语言缺失时间序列的填充及合并:补齐时间序列数据中所有缺失的时间索引、使用merge函数合并日期补齐之后的时间序列数据和另外一个时间序列数据(补齐右侧数据)
    Thinkphp6.0.x反序列化漏洞复现
    双11“静悄悄”,折腾14年终于卷不动了?
  • 原文地址:https://blog.csdn.net/Crushlikearush/article/details/126818078
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号