本次 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. buu 内涵软件

    一.无壳. 并且是32位程序, 二.用ida静态调试一下. 这里我脑子发热啊,flag已经在眼前,活生生被我放跑了,靠,我直接搜索字符串,然后就一脸懵逼的,进入了很多不知名的函数,就炸了,看了wp才知 ...

  2. Anaconda软件安装使用问题

    目录 更新源 用conda安装包出现的环境不一致问题 更新源 命令行 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...

  3. kong配置service和route实现简单API代理

    目录 通过konga连接kong实现API接口代理 1. ADD NEW SERVICE 2. ADD ROUTE 3. 验证API 代理 浏览器验证 请求kong api kong使用Admin A ...

  4. python08篇 发邮件和异常处理

    一.发邮件 import yamail smtp = yamail.SMTP(host='smtp.qq.com', # 改成自己邮箱的服务器即可,其他的比如smtp.163.com user='65 ...

  5. win10 删除WPS提示存在wpsupdate.exe进程

    这个进程在:WIN10  任务管理器  的"详细列表"查找可能有1-2个类似的,全部关闭才能删除

  6. IDEA 生成类注释和方法注释

    目录 一.生成类注释-01 1.1.生成类注解模板 1.2.把模板设置到IDEA中 1.3.效果图 二.生成类注释-02 2.1.生成类注释模板 2.2.把模板设置到IDEA中 2.3.效果图 2.4 ...

  7. 从代码生成说起,带你深入理解 mybatis generator 源码

    枯燥的任务 这一切都要从多年前说起. 那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表. 因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表 ...

  8. 禁用ipv6的两种方法

    1 通过系统配置文件/etc/sysctl.conf 在sysctl.conf文件中添加行 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.all.disable_ipv6 = 1 # ...

  9. 微信小程序云开发-云存储-使用云开发控制台存储文件

    一.存储 进入[云开发控制台]>点击[存储].将需要存储的文件通过[上传文件]方式上传上去.或者通过拖拽的方式上传文件.  二.存储文件的类型 可以存储的文件有很多,常见的文件类型包括:word ...

  10. 数据库开发之ETL概念

    原文链接:https://blog.csdn.net/jianzhang11/article/details/104240047/ ETL基础概念 - 背景随着企业的发展,各业务线.产品线.部门都会承 ...