本次 5 道题均来自Codeforce

关于树形DP的算法讲解:Here

791D. Bear and Tree Jumps

如果小熊每次能跳跃的距离为1,那么问题变为求树上任意两点之间距离之和。

对于每一条边sum1和sum2分别表示边的左右点数,ans=各边的sum1*sum2之和即为答案。

而本题最大跳跃距离为k,答案变为(ans+sum)/k。sum为每一条边需要多走x步才能整除k的x之和。

树上任意两点间距离len=depth[x1]+depth[y1]-2*depth[f],f表示点x1和点y1的最近公共祖先。

计算sum的方法:dp[i][j]表示到i点的距离对k取摸为j的点的总数。

则对于任意两点a和b,dis需要满足(len[a][b]+dis)%k==0。

每当搜索到一个点时,用O(k^2)的方法枚举所有情况。

const int N = 2e5 + 10;
vector<int>e[N];
ll f[N][5] = {0}, a[N], ans;
int n, k;
void dfs(int u, int fa, int num) {
f[u][num % k] = 1;
a[u] = 1;
for (int v : e[u]) {
if (v == fa) continue;
dfs(v, u, num + 1);
for (int j = 0; j < k; ++j)
for (int r = 0; r < k; ++r) {
int dis = (j + r - num * 2) % k;
int rev = (k - dis) % k;
ans += rev * f[u][j] * f[v][r];
}
a[u] += a[v];
for (int j = 0; j < k; ++j) f[u][j] += f[v][j];
ans += (n - a[v]) * a[v];
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> k;
for (int i = 1, x, y; i < n; ++i) {
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, -1, 0);
cout << ans / k << "\n";
}

1120D. Power Tree

实在没想到该如何去写出输出方案

附一篇优秀题解:Here

1153D. Serval and Rooted Tree

似乎很板子?

叶子节点dp[i]=1

如果节点取max则dp[i]=min(dp[子节点们])

如果取min则dp[i]+=dp[子节点们]

答案就是 叶子节点个数+1-dp[1]

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n; cin >> n;
vector<int> m(n);
for (int &x : m) cin >> x;
vector<int> sz(n);
vector<vector<int>> e(n);
for (int i = 1, x; i < n; ++i) {
cin >> x;
e[--x].push_back(i);
}
function<int(int)> dfs = [&](int u) {
if (e[u].empty()) {
sz[u] = 1;
return 1;
}
int x = 0;
if (m[u] == 1) x = n;
sz[u] = 0;
for (int v : e[u]) {
int y = dfs(v);
sz[u] += sz[v];
if (m[u] == 1) x = min(x, sz[v] - y);
else x += y - 1;
}
if (m[u] == 1) return sz[u] - x;
else return x + 1;
};
cout << dfs(0) << "\n";
}

735E. Ostap and Tree

1060E. Sergey and Subway

题意:给出一个树,把树上任意两个相隔一个点的点加一条边,问加完边之后任意两点的距离和是多少.

先把问题转化一下,求树上所有点对的边距离和,那么针对每一条边他的贡献就是 一端点数*另一端点数 这是所有的要使用她的点对。 那么问题就被简化了,针对这道题目,可以得到距离为偶数的点 \(x/2\),距离为奇数的为 \((x+1)/2\) ,那么就是奇偶层计算距离时需要加1,那么我们统计出这个再和之前每条边的贡献求和除2就是答案

const int N = 240000;
vector<int>e[N];
ll cnt, ans, n, f[N]; // f[N] 该点下方的点数
void dfs(int u, int fa, int de) {
f[u] = 1;
cnt += de;
for (int v : e[u]) {
if (v == fa) continue;
dfs(v, u, de ^ 1);
f[u] += f[v];
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n;
for (int i = 1, x, y; i < n; ++i) {
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, -1, 0);
for (int i = 1; i <= n; ++i) ans += f[i] * (n - f[i]);
ans += cnt * (n - cnt); //奇偶层的贡献
cout << ans / 2;
}

CF上部分树形DP练习题的更多相关文章

  1. 【动态规划】树形DP完全详解!

    蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...

  2. 【BZOJ-2435】道路修建 (树形DP?)DFS

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3115  Solved: 1002[Submit][Statu ...

  3. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  4. bzoj 2286(虚树+树形dp) 虚树模板

    树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5002  Sol ...

  5. 动态规划专题(二)——树形DP

    前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...

  6. CF F - Tree with Maximum Cost (树形DP)给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大。输出最大的值。

    题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. ...

  7. CF EDU 1101D GCD Counting 树形DP + 质因子分解

    CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...

  8. CF 337D Book of Evil 树形DP 好题

    Paladin Manao caught the trail of the ancient Book of Evil in a swampy area. This area contains n se ...

  9. CF 219D 树形DP

    CF 219D [题目链接]CF 219D [题目类型]树形DP &题意: 给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到 ...

随机推荐

  1. Defense:MS08067漏洞攻防渗透实验

    实验环境 Windows XP SP3 IP:172.16.211.129 百度网盘:https://pan.baidu.com/s/1dbBGdkM6aDzXcKajV47zBw     靶机环境 ...

  2. MySql:mysql修改密码及配置远程连接

    通过配置文件修改 mysql5.7  mysql库下面的user表没有password字段无法修改密码,5.7版本已经不再使用password来作为密码的字段了  而改成了authentication ...

  3. springboot项目启动,停止,重启

    参考博客 https://www.cnblogs.com/c-h-y/p/10460061.html 打包插件,可以指定启动类 <build> <plugins> <pl ...

  4. 10 shell test命令

    0.test命令的用法 1.与数值比较相关的test选项 2.与字符串判断相关的 test 选项 3.与文件检测相关的test选项 4.与逻辑运算相关的test选项 5.注意点与总结 1.test中变 ...

  5. 职场人都该了解<荷花定律>

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 荷花定律 ,听起来很新奇的一个 ...

  6. Python单元测试框架unittest之单用例管理(一)

    一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...

  7. Codeforces Round #139 (Div. 2) 题解

    vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...

  8. 学前端的第一门语言HTML

    学前端最终要做的就是制作各种各样的网页,html就相当于网页的骨架,所以我们学习前端的第一步就是先学html,接下来学习什么是html. 什么是HTML? HTML指的是超文本标记语言(Hyper T ...

  9. this的四种用法!

    经常会有人问到this的用法,其实简单来说,this有四种应用场景,分别是在构造函数上.对象属性中.普通函数中.call和apply方法中. 首先我们来看第一种:在构造函数中的用法 第二种是在在对象属 ...

  10. HTML - form表单操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...