CF上部分树形DP练习题
本次 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练习题的更多相关文章
- 【动态规划】树形DP完全详解!
蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- 动态规划专题(二)——树形DP
前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...
- 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)的和最大.输出最大的值. ...
- CF EDU 1101D GCD Counting 树形DP + 质因子分解
CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...
- 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 ...
- CF 219D 树形DP
CF 219D [题目链接]CF 219D [题目类型]树形DP &题意: 给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到 ...
随机推荐
- buu 内涵软件
一.无壳. 并且是32位程序, 二.用ida静态调试一下. 这里我脑子发热啊,flag已经在眼前,活生生被我放跑了,靠,我直接搜索字符串,然后就一脸懵逼的,进入了很多不知名的函数,就炸了,看了wp才知 ...
- Anaconda软件安装使用问题
目录 更新源 用conda安装包出现的环境不一致问题 更新源 命令行 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...
- kong配置service和route实现简单API代理
目录 通过konga连接kong实现API接口代理 1. ADD NEW SERVICE 2. ADD ROUTE 3. 验证API 代理 浏览器验证 请求kong api kong使用Admin A ...
- python08篇 发邮件和异常处理
一.发邮件 import yamail smtp = yamail.SMTP(host='smtp.qq.com', # 改成自己邮箱的服务器即可,其他的比如smtp.163.com user='65 ...
- win10 删除WPS提示存在wpsupdate.exe进程
这个进程在:WIN10 任务管理器 的"详细列表"查找可能有1-2个类似的,全部关闭才能删除
- IDEA 生成类注释和方法注释
目录 一.生成类注释-01 1.1.生成类注解模板 1.2.把模板设置到IDEA中 1.3.效果图 二.生成类注释-02 2.1.生成类注释模板 2.2.把模板设置到IDEA中 2.3.效果图 2.4 ...
- 从代码生成说起,带你深入理解 mybatis generator 源码
枯燥的任务 这一切都要从多年前说起. 那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表. 因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表 ...
- 禁用ipv6的两种方法
1 通过系统配置文件/etc/sysctl.conf 在sysctl.conf文件中添加行 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.all.disable_ipv6 = 1 # ...
- 微信小程序云开发-云存储-使用云开发控制台存储文件
一.存储 进入[云开发控制台]>点击[存储].将需要存储的文件通过[上传文件]方式上传上去.或者通过拖拽的方式上传文件. 二.存储文件的类型 可以存储的文件有很多,常见的文件类型包括:word ...
- 数据库开发之ETL概念
原文链接:https://blog.csdn.net/jianzhang11/article/details/104240047/ ETL基础概念 - 背景随着企业的发展,各业务线.产品线.部门都会承 ...