codeforces 405 D. Bear and Tree Jumps 树形dp
来源:互联网 发布:电缆分层算法 编辑:程序博客网 时间:2024/06/09 15:46
题目链接
http://codeforces.com/contest/791/problem/D
题意
给一个树,节点数为
思路
官方题解在这里:http://codeforces.com/blog/entry/51068(当然如果我看的懂的话,现在就不写博客了QAQ)
首先对于
如何求所有的偏置量呢?用树形dp,对于每个节点u,我们分别计算以u为根节点的子树中,一定经过u的路径的总偏置量之和,不断递归下去,就可以求得所有偏置量。
对于偏置量的具体求法,我们记录每个节点到root的距离,树中任意一条路径的长度
计数统计的部分很简单,就不多说了,详见代码。
代码
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;#define MS(x, y) memset(x, y, sizeof(x))#define PB push_backtypedef long long LL;const int MAXN = 2e5 +5;vector<int> vec[MAXN];int n, k;LL ans;LL cnt[MAXN][6], siz[MAXN];void dfs(int u, int fa, int dep) { cnt[u][dep % k] = siz[u] = 1; int v, need; for (int i = 0; i < vec[u].size(); ++i) { v = vec[u][i]; if (v == fa) continue; dfs(v, u, dep + 1); for (int j = 0; j < k; ++j) for (int l = 0; l < k; ++l) { need = ((k - (j + l - 2 * dep)) % k + k) % k; ans += 1ll * need * cnt[u][j] * cnt[v][l]; } for (int j = 0; j < k; ++j) cnt[u][j] += cnt[v][j]; siz[u] += siz[v]; } ans += 1ll * siz[u] * (n - siz[u]);}int main() { while (~scanf("%d%d", &n, &k)) { for (int i = 1; i <= n; ++i) vec[i].clear(); MS(cnt, 0); MS(siz, 0); for (int i = 1, u, v; i < n; ++i) { scanf("%d%d", &u, &v); vec[u].PB(v); vec[v].PB(u); } ans = 0; dfs(1, 0, 0); printf("%I64d\n", ans / k); }}
0 0
- codeforces 405 D. Bear and Tree Jumps 树形dp
- Codeforces Round #405 D. Bear and Tree Jumps 树形DP
- Codeforces 791D Bear And Tree Jumps 树形DP
- CF Bear and Tree Jumps树形DP
- Codeforces790B Bear and Tree Jumps -- 树形DP
- codeforces D. Bear and Tree Jumps
- codeforces 791D Bear and Tree Jumps
- Codeforces 711C. Bear and Tree Jumps【树形dp好题】
- 791D Bear and Tree Jumps
- Codeforces Round #405 Div. 1 B. Bear and Tree Jumps
- Codeforces790B. Bear and Tree Jumps 【树型DP】
- CF771C:Bear and Tree Jumps(树形dp & 树上距离和)
- codeforces 711C. Bear and Tree Jumps(树上距离)
- CF791D-Bear and Tree Jumps
- Codeforces 462D Appleman and Tree 树形dp
- CodeForces - 482D Random Function and Tree(树形DP)
- codeforces 462 d Appleman and Tree(树形dp)
- Codeforces 385D Bear and Floodlight(几何+dp)
- 【leetcode】滑动窗口法训练
- Web Service系列之实例之使用urllib发送SOAP POST请求
- strstr 函数介绍
- 例题3-5 生成元
- kettle 连接mysql数据库 问题
- codeforces 405 D. Bear and Tree Jumps 树形dp
- Android使用Handler造成内存泄露的分析及解决方法
- Web Service系列之数组参数
- java数据类型的范围
- 学习记录 蝙蝠算法
- SSL 2299——护卫队
- python3.5.2中pycharm中pip install xgboost出现No files/directories in...
- 关于elasticsearch的问题解决记录
- Web Service系列之常见问题