树形DP
文章平均质量分 53
1
hesorchen
这个作者很懒,什么都没留下…
展开
-
abcE-Xor Distance思维、拆位
题目 E - Xor Distances 给出一颗带边权的树。求所有简单路径异或和。 解题思路 找任一结点x为根结点。记F(u,v)为u到v简单路径的异或值。 对于两个结点u,v,设w为uv的最近公共祖先,有 F(u,v) = F(u,w) ^ F(w,v) = F(u,w) ^ F(w,v) ^ F(x,w) ^ F(x,w) = F(u,x) ^ F(x,v) 由于异或值每一位互不影响,因此可以拆位考虑。设DP[i][j][k]DP[i][j][k]DP[i][j][k]为子树中所有结点 到结点iii、原创 2021-10-12 09:21:35 · 234 阅读 · 1 评论 -
CF1153D神仙DP
题目 D. Serval and Rooted Tree 给出一颗有根树,在每个非叶子节点都有一个属性: maxmaxmax : 在所有儿子的权值中取最大值 minminmin : 在所有儿子的权值中取最小值 假设这颗树有k个叶子结点,现在你需要对这k个叶子结点赋值[1,k]且两两互不相同。问根结点的最大值可以是多少。 求解 很难用数值直接处理,我们使用排名进行树形dp,排名第1的权值即为k,最低排名的权值即为1。 令dpudp_udpu表示以u为根的子树的所有叶节点中,结点u可以取得的最大值的排名,原创 2021-09-21 15:59:01 · 162 阅读 · 0 评论 -
HDU6567树的重心、换根DP
题目 Cotree 用一条边将两颗树连接起来,使得点对之间的距离和最小。 求解 找出两棵树的重心,连接重心,换根DP求一下每条边的贡献即可。 #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; vector<int> vec[N]; bool vis[N]; int nd1, nd2; int N1, N2; int siz[N]; void pre(int u, int fa) { vi原创 2021-08-18 16:45:18 · 180 阅读 · 0 评论