Codeforces 791D Bear and Tree Jump(树形DP)
2024-08-29 22:42:09
题目链接 Bear and Tree Jumps
考虑树形DP。$c(i, j)$表示$i$最少加上多少后能被$j$整除。
在这里我们要算出所有$c(i, k)$的和。
其中$i$代表每个点对的距离,$k$为输入的$k$值。
$f[i][j]$表示以$i$为根结点,深度对$k$取模为$j$的点的个数。
状态转移时$f[x][i]$一边更新一边和刚刚计算出的$f[u][j]$统计答案。
具体细节可以看代码。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) const int N = ;
int n, k;
long long sum[N], f[N][], ans = ;
vector <int> v[N]; void dfs(int x, int fa, int dep){
f[x][dep % k] = sum[x] = ; //初始化
for (auto u : v[x]){
if (u == fa) continue;
dfs(u, x, dep + );
rep(i, , k - ) rep(j, , k - ){
int dis = ((i + j) % k - ((dep * ) % k) + k) % k;
int t = ( * k - dis) % k;
ans += t * f[x][i] * f[u][j]; //这一步求出要被k整除则还需补多少的总和 (1)
} rep(i, , k - ) f[x][i] += f[u][i];
sum[x] += sum[u];
ans += (n - sum[u]) * sum[u]; //若没有(1)则这一步求的是树上所有点两两距离和 (2)
}
} int main(){ scanf("%d%d", &n, &k);
rep(i, , n - ){
int x, y;
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
} dfs(, , );
printf("%lld\n", ans / k); //最后除以k
return ;
}
最新文章
- 在WebApi中基于Owin OAuth使用授权发放Token
- 044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)
- iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果
- NYOJ题目1047欧几里得
- HashMap封装的数据用循环快速添加进list中产生的数据集全部相同的问题
- 全新重装win8.1系统后 配置开发及办公环境步骤
- [CareerCup] 7.3 Line Intersection 直线相交
- 在Hadoop伪分布式模式下安装Hive(derby,mysql)
- javascript中sleep等待实现
- Centos7安装Docker Engine
- jquery select三级联动
- html(第一天,div+css)
- 基于visual Studio2013解决C语言竞赛题之0405阶乘求和
- map size mismatch; abort
- Scala开发环境搭建与资源推荐
- Spring Boot环境下出现No operations allowed after connection close错误
- tangent space与object space
- C#/对线程的认识
- Robot Framework+python的安装,配置,环境搭建(纯白篇)
- [POJ2976] Dropping tests
热门文章
- Asp.net Mvc Action重定向总结
- Redis实现之对象(三)
- 54、edittext输入类型限制为ip,inputType应该如何设置
- java如何建项目
- Codeforces #990E Post Lamp
- ZOJ 2676 Network Wars(最优比例最小割)
- 2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
- [luoguP2224] [HNOI2001]产品加工(背包DP)
- BZOJ2916 [Poi1997]Monochromatic Triangles 数论
- Spring MVC @PathVariable 特殊字符