本次 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. CentOS-GitLab迁移(yum至Docker)

    yum备份迁移Docker版的GitLab 注:确保版本一致 1.yum备份 $ gitlab-rake gitlab:backup:create 2.执行完成后,在/var/opt/gitlab/b ...

  2. 25 Linux中的信号

    Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...

  3. Java实验项目二——打印某年某月日历

    Program:打印万年历(输入年份,月份,输出该月的日历,已知1900年1月1日是星期一), 要 求: (1)编写一个方法判断闰年: (2)编写一个方法判断某年某月有多少天: (3)编写一个方法计算 ...

  4. mybatis框架学习第一天

    三层架构: 表现层:用于展示数据 业务层:处理业务需求 持久层:和数据库交互的 3.持久层技术解决方案: JDBC技术: Connecction PreparedStatement ResultSet ...

  5. Leetcode 递归题

    24. 两两交换链表中的节点 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-&g ...

  6. C语言常用函数笔记

    strcmp 比较字符串: sscanf 读取格式化的字符串中的数据: memset 初始化内存的"万能函数",通常为新申请的内存进行初始化工作.对一段内存空间全部设置为某个字符, ...

  7. Podistributor播客分发系统介绍

    特性 向用户暴露节目的别名 URL ,在用户访问时重定向至真实的目标资源 URL ,以高效地进行 CDN 切换和便捷地建立失效转移机制. 异步转发请求至统计服务,以解耦用户请求和数据统计,可方便地接入 ...

  8. Red Hat系统下安装gcc

    这篇是在客户服务器上安装redis碰到的问题.服务器是RedHat,无法直接安装gcc,导致Redis无法安装的解决办法:    1.make redis时候报下面这样的错,原因就是gcc没有安装. ...

  9. 两人团队项目-石家庄地铁查询系统(web版)

    大二上学期做过只有两号线的地铁查询系统,但是只能在控制台操作.这一次将线路加到了六条,并且要求web实现,下面简述一下设计思路和具体代码实现: 1.数据库建表 于我自己习惯而言,我写javaweb项目 ...

  10. 基于JSP的学生考勤管理系统(MySQL版)

    介绍:基于JSP的学生考勤管理系统(MySQL版)1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善.开发环境:Eclipse ,MyS ...