Codeforces 1065F(树形dp)】的更多相关文章

链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$1$(若结点$1$只有$1$个儿子时,结点$1$不能看做叶子), 求经过若干次操作后, 最多可以访问到的叶子数 记$f_1[x]$为初始在$x$,在$x$子树运动,最后不用返回父亲的最大值 $f_0[x]$为必须返回父亲时的最大值 就有$f_1[x]=\max(f_1[y]-f_0[y])+\sum…
题目链接 题意 给一棵树,进行如下操作,如果当前点非叶子,则往子树移动,否则最多向上移动k次,问从根节点开始最多访问多少叶子 思路 预处理出每个点最多能“白嫖”到几个叶子,根据下一个点的状态更新最优方案 代码 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl; const int maxn = 1e6+5; const int ma…
题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显的树形dp, 设dp[x]是指以x为根的子树中可以获得的最大的值, sz[x]是指以x为根的子树中叶子节点的个数. 若x是max, 那么dp[x] = max(sz[x] - sz[y] + dp[y]),对应的决策相当于把最大的几个值给dp[y] - sz[y]最大的那颗子树. 若x是min, 首…
比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k的值最大,如果这样的最大值有多个,就最大化k. 赛后看了看别人的代码仔细想了一想,还是挺容易的. 首先将树分为若干个连通块,考虑一个权值求和最大的连通块,设该最大值为sum,那么其他所有的连通块,权值求和都不可能比当前的连通块大. 在不考虑最大化k的情况下,就没有必要再将其他的连通块加进来(因为如果…
题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单路径没有增加.所以,问题相当于转化为找一个基环,使得以基环上的点为根的子树Σ(i从1到n) sz[i]  * (sz[i] - 1) / 2最小.我们把式子转化一下变成求(sz[i]的平方和 - n) / 2.相当于我们需要求sz[i]的平方和.但是,我们并不知道哪个是基环,怎么求sz呢?我们发现一…
题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能是恶魔所在的点(虽然我也是没有证明凭感觉,逃~~). 那么问题就难在怎么快速找到这m个点中距离最远的两个点?我们会想到这跟 找树的直径非常相似,于是就是用找树的直径的方法:树形dp找出这两个点. 然后距离这两个点的距离都小于等于d的就统计答案即可. 然后要注意m=1的情况. 细节请看代码: #inc…
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output The country Treeland consists of n cities, some pairs of them are connected with unidirectional roads. Over…
原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知道有m个点是危险的,问那个Evil可能存的点有多少. 分析: 昨晚傻X地暴力提交,自然得到的是TLE.今天看一神的代码才突然明白…… 跟以往的题一样,两个DFS就可求出答案. 第一个DFS搜出所有危险点,并求出枝干上的点到最远的危险点的距离. 第二次DFS再往回遍历.具体的参考代码. 代码: #inclu…
题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几使根节点的值最大. 思路:设\(dp[x]\)为节点x为根的子树中x的最大值,\(sz[x]\) 为节点x的子树中叶子的个数,可以推出x在它的子树中能选的叶子数量即为以x为根的子树中x的最大值. 若x为max节点,\(dp[x]=max(sz[x]-sz[y]+dp[y])\),y是x的子节点,意思…
题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/corsica6/article/details/88115948 有个坑点,不能深搜去找具体方案,不然 test14 会 MLE(或许是本蒟蒻写丑了) 代码: #include <bits/stdc++.h> #define LL long long #define pii pair<int,…