随笔分类 - 树
摘要:嘟嘟嘟 这道题只要树形dp做的熟练的话就能秒(显然我不能)。 令dp[u][0 / 1]表示u所在的子树和u相连的联通块没有/有敌人的最少代价。而且按题中所述,这个联通块只能有1个敌人。 分情况: 若敌人在节点u: 则dp[u][0] = INF,dp[u][1] = Σmin{dp[v][0],
阅读全文
摘要:嘟嘟嘟 如果把毛毛虫的毛都剃下去,那么就是求树的直径。现在加上毛,也可以仿照树的直径树形dp的做法。 在dfs的时候开两个变量,分别维护以u为端点的最长链Max1和次长链Max2,然后像求树的直径那样更新即可。 单开一个dp[u]表示在u是的最长链,这个最长链是包含u及其毛的,而上面的不包括,这样方
阅读全文
摘要:嘟嘟嘟 虽然题面很长,但是静下心来看完后,还是掩盖不了这是一道水体的事实。 发现这是一棵完全二叉树,而且深度只有40。 那么dp[u][l][r]表示到达节点u,有 l 条公路,r条铁路没修。转移方程就是分两种情况递归下去就行啦。 然后中间节点只是用来记录答案的,在叶节点计算。 据说这道题卡空间,但
阅读全文
摘要:嘟嘟嘟 这道题可以说是[HNOI2003]消防局的设立的升级版。距离从2改为了d。 辛亏d只有20,这也就是一个切入点。 令f[u][j]表示u四周 j - 1的距离需要被覆盖,g[u][j]表示u可以像四周覆盖 j 的距离。 考虑转移方程,令v为u的其中一个儿子: 1.f[u][j]:直接从v延伸
阅读全文
摘要:嘟嘟嘟 树形dp水题啦。 刚开始以为和[SDOI2006]保安站岗这道题一样,然后交上去WA了。 仔细想想还是有区别的,一个是能看到相邻点,一个是能看到相邻边。对于第一个,可以(u, v)两个点都不放,然而对于这道题就不行了。 不过dp方程更简单:dp[u][0/1]表示u这个点不放/放士兵的最优答
阅读全文
摘要:嘟嘟嘟 n个点n条边,说明图中存在一个简单环,更准确的说是每一个连通块中存在一个简单环(因为图可能不连通)。 然后有人给这个玩意起了个名字:基环外向树。 然而并没有什么用。 思路很简单:断环为链,就变成了一棵树了。为了防止断开的两端(x, y)同时被选,从x和y分别树形dp一下,然后硬性规定根节点不
阅读全文
摘要:嘟嘟嘟 01分数规划+树形背包。 然后就没了。 结果我调了半天,原因还是树形背包不熟练。 我是用dfs序求的,转化的时候,是dp[i][j]转化到dp[i + 1][j + 1]或dp[i +siz[pos[i]]][j],而不是像普通的dp从别的状态转化到dp[i][j],所以最后的答案应该考虑到
阅读全文
摘要:嘟嘟嘟 一看就是树形dp。 刚开始我的状态dp[i][0 / 1]表示以 i 为根的子树,i 选 / 不选时的最小的经费。然后转移方程我就推不出来了,因为无法很好的表示 i 和子树的关系。比如如果 i 不选,那么 i 的子节点可以选一个也可以选多个也可以一个不选,因为 i 的儿子的儿子选了的话,i
阅读全文
摘要:通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接。但是每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。虽然我可以通过消耗能量来破坏房间里的魔法,但是我的能量是有限的。那么,如果我最先站在1号房间(1号房间的保护魔法依然是有效的,也就是,如果不耗费能量,
阅读全文
摘要:我虽然做了好几道树形背包的题,但是一直不是十分理解,对于每一道题,总是看题解就明白,然后换一道题自己写不出来。临近NOIP,gg让我们强化一下背包以及树形背包,我也恰有此打算,于是又开始从头学习了树形背包。 看了好多博客以及论文之后,对树形背包确实有了一个全新的认识,尤其是这篇博客以及徐持恒的论文《
阅读全文
摘要:嘟嘟嘟 一道非常好的构造题。 我反正是一点思路都没有,最后还是看了题解。 假如n = 2,那么树的重量就是di,j。 然后n = 3,画一个图:,则重量=(d1,3 + d2,3 - d1,2) / 2。 n = 4同理:,加上的应该是(d1,4 + dj,4 - d1,j) / 2 (j < 4)
阅读全文
摘要:嘟嘟嘟 自底向上贪心,优先删除每一个儿子中代价最小的一个。 正确性我也不是十分明白,画图的时候发现贪心删边都对,于是试一试竟然AC了…… 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5
阅读全文
摘要:嘟嘟嘟 好题,好题…… 看这个修改和询问,就知道要么是求完dfs序后线段树维护,要么是树剖。又因为这道题都是子树的操作,没有链上的,所以线段树就够了。 然而重点不是这个。这道题最麻烦的是线段树pushdown时对于每一个节点打的标记都不一样,因为每一条边上的能力值不一样。这也是这道题最巧妙的一点:我
阅读全文
摘要:嘟嘟嘟 题面很迷,看这个吧。 首先暴力很简单,从每一个叶子节点开始爬,直到那条特殊的边。 正解稍微想想就能搞出来:(x, y)这条特殊的边把整棵树分成了两部分,然后我们分别从x, y开始在他的那部分子树dfs,求出到达节点v时满足条件的一个区间。因为从v到u是向下取整,那么反过来合法的区间就是[k
阅读全文
摘要:嘟嘟嘟 中序遍历有一个特点:序列[1, n]是一个中序遍历,i 是根节点,则[1, i - 1]是他的左子树的中序遍历,[i + 1, n]为右子树的中序遍历。所以就想到了区间dp,对于[i, j]枚举根节点k,则dp[i][j] = max(dp[i][k - 1] * dp[k + 1][j]
阅读全文
摘要:嘟嘟嘟 一道树形dp题。 令dp[u]表示以u为根时所有点的深度之和。考虑u到他的一个子节点v时答案的变化,v子树以外的点的深度都加1,v子树以内的点的深度都减1,所以dp[v] = dp[u] + (n - siz[v]) - siz[v]。于是dp式就搞出来了。 所以两边dfs,第一遍求siz和
阅读全文
摘要:嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想。令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意是实数二分),每一个点得到新的权值v[i] - mid * c[i],然后树上背包求最大值。如果最大
阅读全文
摘要:嘟嘟嘟 这应该算一道树形背包吧,虽然我还是分不太清树形背包和树形dp的区别…… 首先dp[i][u][j] 表示在u的前 i 棵子树中,留了 j 条树枝时最大的苹果数量,而且根据题目描述,这些留下的树枝一定都连在u上。 然后我们从1~j 枚举 k,于是 dp[i][u][j] = max(dp[i
阅读全文
摘要:嘟嘟嘟 一看完题我就知道是树形dp,状态都想出来了:dp[i][j]表示以 i 为根节点的子树,选了 j 个用户时的最大利润。然后我就卡住了……直到看题解的那一刻…… 题解说:树形背包。于是我就知道为什么gg了:我总共就做了一道树形背包。 思路大概是这样的:对于一个节点u,枚举他的儿子v,然后dfs
阅读全文
摘要:嘟嘟嘟 这好像是一种树上背包。 我们令dp[i][j] 表示在 i 所在的子树中(包括节点 i)分离出一个大小为 j 的子树最少需割多少条边。 那么转移方程就是 dp[u][j] = min(dp[u][j], dp[u][j - k] + dp[v][k] - 1) (v是u的一个儿子) 理解起来
阅读全文

浙公网安备 33010602011771号