本次 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. javascript数组 (转)

      javascript的Array可以包含任意数据类型,并通过索引来访问每个元素.   要取得Array的长度,直接访问length属性:   var arr = [1,2,3.14,'Hell0' ...

  2. Spring Cloud组件和架构图

    Spring Cloud是微服务架构的集大成者,将一系列优秀的组件进行了整合. 服务网关:聚合内部服务,提供统一的对外API接口,屏蔽内部实现.可以解决跨域.认证和前端调用负责的问题,便于项目重构.可 ...

  3. Spring boot中相关的注解

    一.相关类中使用的注解 @RestController:REST风格的控制器 @RequestMapping:配置URL和方法之间的映射 @SpringBootApplication:应用程序入口类 ...

  4. 支持 Homebrew 安装和编辑器模式的 flomo 命令行工具

    什么是 flomo-cli 这是一款可以在命令行中将笔记和想法保存到 flomo 的工具. 基于 Golang 实现,可通过 Homebrew 便捷安装. GitHub Repo:https://gi ...

  5. C语言:printf("")标志详解

    %d 十进制整数 %ld  十进制长整型 %hd 十进制短整型 %o 八进制整数 %X  %x  十六进制 整数 %f 以十进制形式输出 float 类型: %lf 以十进制形式输出 double 类 ...

  6. Appearance-Based Loop Closure Detection for Online Large-Scale and Long-Term Operation

    Abstract: 本文提出一种用于大规模的长期回环检测,基于一种内存管理方法:限制用于回环检测的位置数目,以满足实时性要求. introduction: 大场景存在的最关键问题:随着场景增大,回环检 ...

  7. 忘记Apple ID密码,如何从iPhone/iPad上移除iCloud账号

    忘记Apple ID密码?不用担心!在本文中,我们将分享3种有效方法,即使您不知道密码,也可以轻松移除iPhone或iPad设备上的iCloud账号. 注意:移除iCloud 账号前请备份数据 在开始 ...

  8. Web 字体 font-family 浅谈

    前言 最近研究各大网站的font-family字体设置,发现每个网站的默认值都不相同,甚至一些大网站也犯了很明显的错误,说明字体还是有很大学问的,值的我们好好研究. 不同的操作系统.不同浏览器下内嵌的 ...

  9. 13Java进阶——IO、线程

    1 字节缓冲流 BufferInputStream 将创建一个内部的缓冲区数组,内部缓冲区数组将根据需要从包含的输入流中重新填充,一次可以读取多个字节 BufferOutputStream 该类实现缓 ...

  10. []*T *[]T *[]*T 傻傻分不清楚

    前言 作为一个 Go 语言新手,看到一切"诡异"的代码都会感到好奇:比如我最近看到的几个方法:伪代码如下: func FindA() ([]*T,error) { } func F ...