Loading [MathJax]/jax/output/CommonHTML/jax.js

树链剖分刷题总结

前言

因为kma过菜导致被数据结构吊打QWQ,这里总结一下做过的树剖题,大概是个一句话题解+记录犯过的睿智错误的地方


染色

传送门

染色

分析

先考虑在线段树上维护区间颜色段的做法:记一下区间左右端点,每次合并上来是左儿子总数+右儿子总数,再判一下中间颜色是否一样决定是否-1
在树上维护同理,注意在跳重链的时候判一下两段重链相邻部分是否颜色一致

博客链接

染色


月下“毛景”树

传送门

月下“毛景”树

分析

第一遍DFS的时候把边权下放到点上,注意跳重链最后跳过LCALCA的点权是上面边下放下来的)

博客链接:

月下“毛景”树


松鼠的新家

传送门

松鼠的新家

分析

每次走边可以看做沿途点权+1,但起点不要+1(完美被坑)
(另:本题可以树上差分,代码待补)

博客链接:

松鼠的新家


部落冲突

传送门

部落冲突

分析

先把边权下放到点上(常规操作),然后考虑两种办法维护:

  • 同染色,查询区间颜色段是否为1且均为连通
  • 维护区间最值,给连通和不连通分别打1或0,然后查询最值判断是否连通

博客链接

部落冲突


树上操作

传送门

树上操作

分析

洛谷链剖板的弱化版,着重说一下字树加等于直接在线段树上modify(1,num[u],num[u]+siz[u]1,d)(利用dfs序的思想,一波dfs下去一个节点的子树(含它自己)的dfs序肯定是连续一段,且子树节点中dfs序最大的一个为siz[u]1

博客链接

树上操作


旅游

传送门

旅游

分析

维护一个bool类型的反色标记记录是否需要取反(取两次等于不取),每次取反时sum(p)=2sum(p),最大值变成原最小值的相反数,最小值同理
坑点:
听说上面的代码可以这么写:

sum(p) -= 2 * sum(p), Max(p) = -Min(p), Min(p) = - Max(p);

我tm当场去世。

博客链接

旅游

posted @   kma_093  阅读(271)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示