![](https://img-blog.csdnimg.cn/6e901c34e17746b9ab6f4945b3f3957d.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
树形dp
文章平均质量分 81
StaroForgin
这个作者很懒,什么都没留下…
展开
-
[航海协会]树
被OneInDark随切了。原创 2022-08-15 10:49:38 · 202 阅读 · 0 评论 -
[ARC142D]Deterministic Placing
终于有一场没有掉分的ARC了。。。原创 2022-06-20 19:32:29 · 522 阅读 · 4 评论 -
[联合省选2022]最大权独立集问题
不做这道题,亏大分...原创 2022-04-28 16:28:02 · 474 阅读 · 0 评论 -
[省选联考 2022]填树
考场上直接被哞哞梅爆切!!!原创 2022-04-24 20:33:42 · 616 阅读 · 0 评论 -
[硫化铂]中心城镇问题
又被JZM吊打了。原创 2022-01-20 10:26:04 · 356 阅读 · 1 评论 -
[海军国际项目办公室]仙人掌
在某多校OJ上即使加了if(编译选项)写JZM是一条色狗仍然会CE,这告诉我们说真话是危险的。原创 2021-11-02 21:08:29 · 161 阅读 · 0 评论 -
[海军国际项目办公室]抑郁刀法
所以说抑郁刀法到底是什么东西。原创 2021-09-12 15:21:44 · 195 阅读 · 0 评论 -
[ARC121E]Directed Tree
Directed Tree题解题目相当于要求iii不能在点iii的后代的节点上出现。如果直接求满足所有条件的树的个数是不大好求的,我们可以先将它转化一下,求不满足条件的树的个数。我们先定义dpi,jdp_{i,j}dpi,j表示在iii的子树上放置了jjj个不满足条件的点的方案数,容易得到转移方程式dpu,j=∑v∈Vu∑k=0jdpu,j−kdpv,kdp_{u,j}=\sum_{v\in V_{u}}\sum_{k=0}^{j}dp_{u,j-k}dp_{v,k}dpu,j=v∈Vu原创 2021-05-30 10:07:17 · 254 阅读 · 0 评论 -
[CF1521D]Nastia Plays with a Tree
Nastia Plays with a Tree题解简单dp很明显,我们可以先定义dpi,jdp_{i,j}dpi,j表示点iii在它的子节点中与jjj个儿子间的边被保留时的子树内最大保留边数。让更改边数最小是等于让保留边数最大的。对于每个dpi,jdp_{i,j}dpi,j,我们只需要记录下它当前dp状态与它的儿子之间的连接情况与儿子状态即可。由于一个点最多只能选择两条边,所以我们只需要找出儿子中选与不选的dp值差距最大的两个即可。有了连接情况,我们就知道哪些链是需要被保留下来的。将这些链原创 2021-05-10 22:09:24 · 148 阅读 · 0 评论 -
[CF1498F]Christmas Game
Christmas Game题解首先看到这个博奕,我们应该很容易联想到取石子的模型。首先,对于深度模kkk不一样的点,明显是不会产生影响的,我们可以只将深度相同模k相同的点建成树来维护。那么对于一棵按深度模kkk值所建出来的树,我们可以发现那些深度为偶数的点是不会产生任何贡献的。因为它们无论如何都会被移动偶数次,一个人移动后,另一个人跟着移动它移动的点,根本不会改变其它点的状态,移动到最后两者的顺序也不会被改变。于是我们可以只考虑深度为奇数的点。而深度为奇数的点被移动一次后就会到一个深度为偶数原创 2021-05-04 13:01:03 · 167 阅读 · 5 评论 -
[CF1517F]Reunion
Reunion题解这道题如果直接去求每个状况的树的最大等级明显是很麻烦的,我们可以先考虑求出对于iii,有多少个树拥有半径大于iii的块。很明显,如果我们将每个等级满足条件的树的数量加起来,是等于所有树的等级之和的。对于等级的处理,我们可以转化成最近的未参加点的距离。可怎么求满足条件的树的数量呢?我们可以考虑容斥,先求出不满足条件的树的数量,再去相减。记dpi,jdp_{i,j}dpi,j表示从点iii出发,到子树内最近的未参加的点的距离为jjj的子树的数量。为方便起见我们再跳到下一个节点时原创 2021-04-26 22:29:29 · 188 阅读 · 0 评论 -
[P4719]【模板】动态DP
动态DP也就是lg上面的拿到模板题。题解如果是直接求权值最大独立集的话,显然,我们有一个O(n)O(n)O(n)树形dp方法。但如果带修改的话我们每次都跑一条链明显是不合适的,O(nq)O(nq)O(nq)这T飞吧。考虑每次修改会影响那些地方的dp值,很明显,只会对这个点到根的这条链上产生影响,但如果我们找重心什么的再去对这条链进行修改是明显不行的。我们得想个办法使得每次的修改次数更少。首先,我们就想到了将dp的转移换成矩阵,这样每个位置的更改会独立出来,对于一条链上,它只会对它自身产生影响。原创 2021-03-13 14:18:12 · 155 阅读 · 1 评论 -
[hdu6566]The Hanged Man
tree题解树dp板子题。首先O(nm2)O\left(nm^2\right)O(nm2)的朴素dp做法应该是十分容易想到的,直接合并即可。由于MAX卷积什么的太,太神仙了,我都没听说过,所以显然不能用来优化转移过程降低时间复杂度,我们就考虑改变一下dp状态。首先,我们知道如果每次只合并一个数的话每次转移明显就是O(m)O(m)O(m)的了,而对于这个数我们又只需要考虑它的父亲在不在,所以很快就可以想到状压,合并时看它父亲在不在。但很明显,直接状压是不现实的,n⩽50n\leqslant 50n原创 2021-03-12 22:03:06 · 277 阅读 · 0 评论 -
[十二省联考2019]希望
希望题解两年前做的题现在才写完,唉…先简化一下题意,当时我竟然理解错题了:给出一棵树,问有多少种选择kkk个有序联通子图的方案,满足存在一个点uuu,其在所有子图内,且子图中所有点到其距离⩽L\leqslant L⩽L。由于要求树上连通块数,首先想到点-边的容斥。由于如果只拿点容斥的话会算重两个点一次,这时刚好用边减去两个端点都可行的情况,就可以得到正确答案。这也是树上连通块计数的一个基本套路。有了上面的方法,我们很快就想到了DP。记fx,if_{x,i}fx,i表示在xxx的子树里,与原创 2021-02-23 20:30:03 · 244 阅读 · 1 评论 -
[八省联考2018]林克卡特树
林克卡特树题解挺简单的一道题。原题断kkk条边连kkk条边权为000的边相当于寻去k+1k+1k+1条不相交链出来,将它们连上得到的结果。所以我们要从原树中选取k+1k+1k+1条链出来,使得它们的权值和最大。我们发现恰好k+1k+1k+1条链这个限制是比较难限制的,考虑通过凸优化二分去进行维护。由于链选取的条数关于贡献的函数一定是一个凸包,我们可以去二分通过选取kkk条链的点的切线的斜率,来进行判断。我们将每条路径的贡献减去当前的二分值,再直接用二分去选取不限量的路径,使得权值最大。若dp原创 2021-02-23 08:44:07 · 265 阅读 · 0 评论 -
树和森林
树和森林题解很好骗分的一道题,有人就在场上骗到了90pts,例子就是我。我们可以先来看一看部分分。14pts:我们直接枚举两个连通块上相连的点,的算法。20pts:很容易发现,在两个联通块上互相相连的点是谁并不重要,记一个点到块上每个点的路径长度总和为,记一个联通块中最大的值为,答案就是,其中表示这个连通块自身的贡献,值可以用一个换根dp来求出,时间复杂度。30pts:再将三个联通块中的中间的连通块与其它连通块相连接的点枚举,答案为其中点为中间块。由于可以通过倍增求出,时间复杂度原创 2020-11-01 17:25:00 · 156 阅读 · 0 评论 -
玩个树
玩个树题解很容易发现,如果有一条边需要保持不变,那么我们一定不会翻他。因为任意一个覆盖它的翻法一定可以被不覆盖它的翻法代替。而需要使得所有的选择路径数量最少,所以我们如果可以将两条需要翻转的链一起翻转,那就将它们连在一起。于是,我们就得到了一个类似长链剖分的做法,在的时间复杂度内求出当前树的答案。可是我们有有一部分边的目标是随意的,于是我们便想到枚举这些边的目标,时间复杂度,其中表示值为2的边的边数。这样的做法可以过掉subtask1,2,5,而subtask3的链与subtask全部值为2原创 2020-08-26 22:13:41 · 260 阅读 · 0 评论 -
[CF735E]Ostap and Tree
Ostap and Tree题解看到这道题,是很容易想到树形dp的。设为在节点的子树中,节点是最近的黑点,且距离超过的点都被满足的方案数。对于在加入每一个的子节点可以发现,若,则,故而在连接两黑点的长度为的路径上一定存在一点使得两点都可以满足条件,故。而当时,则有,肯定存在一些点不满足条件,故。再令为子树内只有自身不满足条件的情况,方便转移。于是,答案就为。的时间复杂度,不会超时。源码#pragma GCC optimize(2)#pragma GCC optimiz原创 2020-07-31 11:54:57 · 236 阅读 · 0 评论 -
概率充电器
概率充电器题解很简单的一道树形dp,不过我们得用容斥的方法转变一下思路。如果我们将dp值设为灯亮的几率,我们的时间复杂度可能被卡到,显然是不行的,我们也就不具体分析了。我们设为ti不被它的子树上任意一点亮的概率(含自身)。很显然,dp1(以下省略1)的转移方程式如下:u点不能被点亮的情况为它自身不亮且它的儿子不能将它点亮的概率的乘积。然后,我们可以用换根的想法改一改...原创 2019-12-07 16:26:54 · 126 阅读 · 0 评论 -
战争调度
战争调度题解这道题最开始想到的是爆搜,但想着想着就成树形dp了。我们令为第i个节点的子树上有j人打仗的贡献值及其祖先的最大值。那非叶节点i的值为我们在搜索整棵树时记录下该节点是否打仗,从叶子节点开始更新当前最大值。最后找到最大的源码#include<cstdio>#include<cmath>#include<cstring&g...原创 2019-10-22 19:10:59 · 237 阅读 · 0 评论 -
乃爱与城市拥挤程度
乃爱与城市拥挤程度题解本题很明显是一道树形dp,我们可以分别记录下当前节点的和与积。在i的子树上,表示距点i距离为j的点的数量,表示距点i为j的点的积,即当前位置当时的拥堵值。为当前点为选定点的人数,为当前点为选定点的拥挤度乘积。每个点对他的祖先的贡献为。我们只需记录下它子孙对其的贡献,与其本身的值即可。源码#include<cstdio>#includ...原创 2019-11-02 16:56:02 · 292 阅读 · 0 评论 -
小凸玩密室
小凸玩密室题解神仙树形dp。我们定义为点亮i后回到i的第j个最小的最小值,为i的第j个最小的另一个儿子的最小值。之后我们一次遍历整棵树,更新其的dp值,统计答案时再将整个过程的值累加即可。因为这是一棵完全二叉树,所以我们可以将其从n到1来遍历,不用dfs来遍历,也可达到一样的效果。源码#include<cstdio>#include<cstring>...原创 2019-11-14 21:28:38 · 178 阅读 · 0 评论