![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
树上算法
文章平均质量分 61
树是OI极其常见的结构
wind__whisper
qwq
展开
-
P4775 [NOI2018] 情报中心(线段树合并)
线段树合并原创 2022-07-29 00:42:30 · 248 阅读 · 1 评论 -
模板:全局平衡二叉树
全局平衡二叉树原创 2022-06-29 17:00:33 · 448 阅读 · 0 评论 -
P5354 [Ynoi2017] 由乃的 OJ(树剖、位运算)
树剖+位运算原创 2022-06-08 17:04:13 · 118 阅读 · 0 评论 -
模板:常系数齐次线性递推(线性代数、多项式)
常系数齐次线性递推原创 2022-06-08 12:53:28 · 223 阅读 · 0 评论 -
P5321 [BJOI2019]送别(LCT)
LCT原创 2022-06-08 09:17:58 · 137 阅读 · 0 评论 -
P5327 [ZJOI2019]语言(线段树合并、生成树)
解析只会扫描线树剖的三只log(悲考虑对每个 uuu 考虑合法的 vvv 的集合,必然是一个联通块。进一步的,观察到这个联通块就是由所有经过 uuu 的路径的端点形成的最小生成树。我们有一个最小生成树的经典结论:最小生成树边权和等于按dfs序排列成圆后邻项距离和除以二,不难发现可以线段树维护。把所有路径做一个树上差分,再结合线段树合并,即可进行求解了。用欧拉序 st 表 O(1)O(1)O(1)求LCA,总复杂度 O((n+m)logn)O((n+m)\log n)O((n+m)logn)代原创 2022-05-27 11:38:56 · 126 阅读 · 3 评论 -
CF1192B Dynamic Diameter(LCT)
LCT维护直径原创 2022-04-06 23:00:19 · 270 阅读 · 0 评论 -
洛谷P7518:宝石(倍增、可撤销并查集)
倍增+可撤销并查集原创 2022-02-27 10:34:22 · 152 阅读 · 0 评论 -
YBTOJ:最短时间(长链剖分、线段树)
长链剖分原创 2022-02-20 13:41:37 · 250 阅读 · 0 评论 -
YBTOJ&BZOJ:大根堆(启发式合并)
树上LIS原创 2022-02-20 09:58:19 · 201 阅读 · 0 评论 -
模板:Prufer序列
强大的数树科技原创 2022-02-07 18:54:28 · 296 阅读 · 0 评论 -
洛谷P4271:New Barns P(倍增)(LCT)(直径)
动态维护直径的几个做法原创 2022-02-04 16:41:59 · 500 阅读 · 0 评论 -
洛谷P5212:SubString(SAM、LCT)
SAM套LCT原创 2022-01-24 13:55:32 · 327 阅读 · 2 评论 -
洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)
点分树练习+一个STL的小trick原创 2022-01-15 00:14:12 · 189 阅读 · 0 评论 -
P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)
比较综合的整体二分应用原创 2021-12-27 23:20:47 · 150 阅读 · 0 评论 -
模板:长链剖分
解决与深度有关的dp的利器原创 2021-12-19 15:49:37 · 303 阅读 · 0 评论 -
P4299 首都(LCT、重心)
利用LCT动态维护重心原创 2021-12-09 23:21:58 · 123 阅读 · 0 评论 -
洛谷P4219 大融合(LCT、虚子树)
关于LCT维护子树问题的方法原创 2021-12-08 23:59:41 · 160 阅读 · 0 评论 -
YBTOJ&洛谷P2387: 魔法森林(LCT)
LCT技巧入门题原创 2021-12-07 22:37:59 · 104 阅读 · 0 评论 -
模板:Link Cut Tree(LCT)
动态树是一种支持森林删边、加边、换根的强大数据结构原创 2021-12-07 22:33:24 · 406 阅读 · 0 评论 -
P3320:寻宝游戏(生成树)
一道神奇的结论题原创 2021-12-05 23:20:35 · 70 阅读 · 0 评论 -
ybtoj&洛谷P4426:毒瘤(虚树,环套树,暴力)
利用关键点之间dp的转移系数构建虚树原创 2021-12-05 21:49:32 · 143 阅读 · 0 评论 -
模板:虚树
虚树解决的问题:树上只有一些特殊点对问题影响较大, 而其他的点往往可以进行压缩,从而实现较为快速的处理原创 2021-12-05 00:13:31 · 280 阅读 · 0 评论 -
P2305 [NOI2014] 购票(点分治、斜率优化)
利用点分治解决树上的斜率优化问题原创 2021-12-04 17:39:31 · 269 阅读 · 0 评论 -
YBTOJ&洛谷P3292:幸运数字(线性基、点分治/倍增)
一道比较难想到的点分治应用原创 2021-12-04 10:56:19 · 217 阅读 · 0 评论 -
洛谷P4292:重建计划(点分治、单调队列)
点分治一道很好的练习题原创 2021-12-04 00:39:00 · 228 阅读 · 1 评论 -
模板:点分治&点分树
点分治:小清新轻算法原创 2021-12-02 00:03:34 · 179 阅读 · 0 评论 -
P3605 [USACO17JAN]Promotion Counting P(树状数组)
解析做法很多的一道题sol1先求出dfs序,离线下来,然后按权值大小的顺序统计答案并插到对应的dfs序中sol2离散化后,dfs过程中动态维护树状数组,利用前后差值求出答案sol3树上dsu就比较无脑了,暴力维护即可但是代码比前两个难写sol4权值线段树合并这个做法在本题中确实是一点优势也没有兼具了常数大和难编写的双重优势(bushi总的来说,前两种做法比较推荐代码使用的是soltion1别问我为什么当时还敲了个树剖和线段树上去#include<bits/stdc+原创 2021-11-18 08:33:27 · 389 阅读 · 0 评论 -
CF1540B Tree Array(期望,dp)
解析关于合理的实现这题卡在最后的小破dp是我没想到的一开始看到200的数据范围就不禁笑出了声lca直接On求!然后就开始大力分类讨论然后就卡在了一个问题上两个栈AB,分别有a和b个元素,随机从两个栈中弹出一个元素,求最后A栈先空的概率我天真的认为,上面那个东西就等于ba+b\frac{b}{a+b}a+bb然后样例3就卡住了。。。事实是一个简单的dp即可所以思路还是要灵通代码#include<bits/stdc++.h>const int N=205;con原创 2021-11-16 20:51:06 · 89 阅读 · 0 评论 -
CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)
解析很妙的一道题看这两个南辕北辙的标签就知道这题不简单看见dp思路还是得打开一开始其实想到按边权排序了但卡在了重构树上遇到dp一定要敢想勇于和图论等结合考虑正解按照边权升序排序依次加边到图中并查集维护连通性和集合内的边数发现,一个联通块合法当且仅当它在某个时刻是当前图的一个团(这个概念还是现查的…)考虑建一个重构树显然所以合法的区间在树上对应的叶子的dfs序是连续的可以通过dfs求出合法的区间,并记录哪些区间可以进行转移最后进行一遍朴素dp即可由于合法的区间只会有On个,原创 2021-11-13 22:40:34 · 142 阅读 · 0 评论 -
CF453C:Little Pony and Summer Sun Celebration(dfs、构造)
解析比较巧妙的一道题首先左一棵dfs生成树出来尝试把它的欧拉序列作为答案但是这样可能会有的地方不符合条件如果x点的奇偶性不符合,就在序列中加入一个(x,fa)同时改变x和fa的奇偶性显然不会超过4*n如果根需要改奇偶性怎么办?最后一次回溯删掉就行了代码#include<bits/stdc++.h>using namespace std;const int N=4e5+100;const int mod=1e9+7;double eps=1e-10;#define原创 2021-11-12 11:03:29 · 86 阅读 · 0 评论 -
NOIP2012:疫情控制(二分、贪心、树上倍增)
解析二分的单调性较为明显,一路推导下去的性质都不算太难想,正解的思路还是不难想到的但从头到尾都实现很考验思维的严密性和代码能力然后我就双重被考验挂了qwq第一交的时候一个地方把倍增的dis数组写成pl,判断封口也有问题…但竟然有70真实考试的时候绝对不能出打错数组这种错!提交前还是要谨慎一些!另外那个判封口…只能说路漫漫其修远兮了…我对于最后根下方儿子(暂且叫它次根好了)与军队贪心匹配的地方写的和题解不太一样题解的实现是:爬到根下方的军队不考虑,然后把所有军队提出来一起贪心我的做法是先给原创 2021-11-07 02:35:57 · 183 阅读 · 0 评论 -
NOIP2016&洛谷P1600:天天爱跑步
文章目录解析sol1:树剖+mapsol2:树剖+离线sol3:dfs维护树状数组+差分解析个人认为本题比同年的逛公园可做许多本题的一个关键是:把慢跑者(u,v)(u,v)(u,v)转化为上升路径上满足depx+tx=depudep_x+t_x=dep_udepx+tx=depu的结点和下降路径上满足−dep+x+tx=depu−2∗deplca-dep+x+t_x=dep_u-2*dep_{lca}−dep+x+tx=depu−2∗deplca的结点x的答案均加一这个感觉不是很难想,由原创 2021-11-01 22:50:46 · 350 阅读 · 0 评论 -
模板:树上启发式合并(dsu on tree)
文章目录解析step1:树剖step2:求出轻儿子的答案(不继承)step3:求出重儿子的答案(继承)step4:加入自己的答案、合并轻儿子的答案并记录答案step5:清空复杂度分析代码所谓树上启发式合并,就是在树上进行启发式合并(逃)解析通过很妙的操作将暴力的复杂度优化到log级别可以解决对子树的一些离线静态问题大概讲一下流程:step1:树剖先剖一下确定重儿子为后来的dsu做准备顺便求出size和dfs序等信息注意这个dfs序不一定要先搜重儿子所以直接在一个dfs函数里解决就可原创 2021-10-20 21:14:00 · 195 阅读 · 0 评论 -
CSP2019&洛谷P5666:树的重心
解析毒题细节有亿点点多我一开始的思路是没有问题的尝试统计有多少种方案能砍出大小在一个区间的子树、当时的想法是线段树合并但是这个玩意在需要保留原树的情况下空间复杂度炸没了…因为我垃圾的实现一个dfs里面就玩了七遍merge函数…空间常数飞起然后分数就和暴力一毛一样qwq考虑一些更灵巧的做法动态维护一个关于值域的树状数组要求一个子树内的答案用遍历到子树根前后的结果相减子树外就是最终的结果减去子树内结果然后我这个垃圾的实现似乎还需要再开一个树状数组动态维护返祖链的答案…虽然实现还是原创 2021-10-16 20:39:25 · 265 阅读 · 0 评论 -
洛谷P1852:跳跳棋(LCA,树形结构)
解析考虑一个三元组(x,y,z)(x,y,z)(x,y,z),看它能如何跳要么是yyy往左右跳,左右边界会变大要么是两边往中间跳,由于最多跨过一个棋子,所以左右边界会变小当三点等距时,无法往中间跳于是我们惊喜的发现:可以互相转移的状态形成了一个二叉树形结构!!!往中间跳的时候,相当于跳父亲;往两边跳相当于跳儿子当且仅当两个状态的根相同时,有解又由于这个跳的操作是可逆的,所以我们的问题就可以转化为两个点在树上的距离于是我们就可以用类似倍增求LCA的思路解决本题代码#include<原创 2021-10-14 20:10:44 · 299 阅读 · 0 评论 -
洛谷P3155:叶子的染色(树形dp)
解析本题的关键是选取哪一个根对答案没有影响还有一个重要的性质是:根节点必定涂色这点对每棵子树作为独立的子问题时依然成立然鹅我完全没有看到上面那俩性质直接暴力设计dp状态0.、1、2 开始莽然后?然后就T了啊…只好开始考虑换根然后?然后就WA了啊…最后捯饬到第四交才过qwq有一点可贵是忍住了没看LOJ的数据吧看到题不要被它的描述迷惑先想想有啥性质先好好想清楚性质再敲,不要硬用min交给代码莽!(尽管最后莽出来了)代码其实不用换根但是换都换了不贴太可惜了#include<原创 2021-10-13 23:35:05 · 146 阅读 · 0 评论 -
YBTOJ:染颜色(KDtree)
文章目录题目描述数据范围解析代码题目描述数据范围n≤105,T≤5n\le10^5,T\le5n≤105,T≤5解析关键是对问题的转化考虑一次修改,一个点需要满足哪些条件才可以满足1.与x的距离不超过lll2.在x的子树内这两个条件可以转化为对深度的限制和对dfs序的限制这样本题就变成一个二维平面区间修改单点查询的问题问题得以解决代码#include<bits/stdc++.h>using namespace std;const int N=5e5+100;原创 2021-09-29 15:12:14 · 111 阅读 · 0 评论 -
YBTOJ&洛谷P4074:糖果公园(树上莫队)
文章目录解析代码所谓树上莫队,就是在树上的莫队(逃)传送门解析似乎就是树上的这道题考虑如何转化为序列问题呢?考虑dfs序但是又一个问题。。。似乎这条链的dfs序不连续啊树剖一下就好啦考虑更阳间的方法求出这棵树的欧拉序,在这个欧拉序上询问那么我们发现,这样的话,其实会多算的部分就都会多算2遍比如样例:以1为根,欧拉序为:13442231那么我们考虑(4-3)对应的序列就是:44223不在路径上的2恰好算了2次所以我们可以利用异或的性质还有一些特判的问题:原创 2021-09-26 21:00:49 · 151 阅读 · 0 评论 -
模板:环套树
文章目录前言解析找环代码练习thanks for reading!前言环套树者,一个环套一棵树也解析定义:n个点,n条边的无向连通图其实就是树多了一条边,连出了一个环性质:如果对环套树进行dfs,多出的一条非树边一定是一条返祖边考虑dfs的过程如果它不是返祖边,dfs的时候就会直接从这条边过去,该边就会成为树边了找环如何在环套树上找到非树边?考虑dfs,如果出边指向已经被搜过的点,那么这条边(和它的反向边)就是非树边注意!:这里dfs的时候不能传来到当前节点的节点fa,而是要传原创 2021-09-09 10:15:20 · 174 阅读 · 0 评论