树剖总结
前言
最近被树剖整得很难受,于是有了这一篇总结。
灵感来源于这几道题:[Ynoi2017] 由乃的 OJ,[SDOI2011] 染色,[TJOI2015] 旅游。
关于树剖
树剖解决的问题一般是动态且与树上的简单路径有关,就是将树上的问题转变到链上,然后用数据结构(线段树)来维护一些复杂信息。
一般解决树剖会遇到的瓶颈:
-
如何处理链上的情况。
-
查询时如何合并剖分开的链。
下文主要记录处理第二个瓶颈的套路。
合并链
这
三个题有异曲同工之处,最后要将起点
写法一
这三道题最后
以[Ynoi2017] 由乃的 OJ为例,就有:
if(!flagl&&!flagr) memcpy(all,(dep[u]<=dep[v])?now.lans:now.rans,sizeof(all)); else if(id[u]<=id[v]) memcpy(all,(l*(now+r)).lans,sizeof(all)); else memcpy(all,((now+l)*r).lans,sizeof(all));
像旅游和染色就要更复杂一些,因为要判
写法二
先求出两点的最近公共祖先,然后将
小 trick 就是合并时重载运算符,结构体写初始化来简便代码。
本文作者:dayz_break
本文链接:https://www.cnblogs.com/dayz-break/p/18449283
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步