题意:

给出一棵树,一个人可以在树上跳,每次最多跳\(k(1 \leq k \leq 5)\)个点

定义\(f(s,t)\)为从顶点\(s\)跳到顶点\(t\)最少需要跳多少次

求\(\sum\limits_{s<t}f(s,t)\)

分析:

注意到\(k\)很小,为了方便转移,定义:

  • \(sz(u,i)\)为\(u\)的子树中与\(u\)的距离模\(k\)等于\(i\)的孩子节点的个数
  • \(d(u,i)\)为从\(u\)跳到\(sz(u,i)\)对应的节点的跳数之和

转移:

  • \(sz(u,(i+1)\, mod \, k) += sz(v, i)\),其中\(v\)是\(u\)的儿子节点
  • \(d(u,(i+1)\, mod \, k) += d(v, i), 0<i<k\)
  • \(d(u,1 \, mod \, k) += d(v,0) + sz(v, 0)\),因为到\(v\)距离为\(k\)的整数被的那些节点转移到\(u\)时会多跳一步

统计答案:

在递归到点\(u\)时,我们统计那些\(lca(s,t)=u\)的路径的贡献

这样的路径有两类:

  • \(u\)到其孩子节点的路径
  • 来自\(u\)的两个不同子树的孩子节点形成的路径

第一类答案很好计算,就是\(\sum d(u,i)\)

第二类答案时,假设枚举到\(u\)的某个子树\(v\),而且之前的子树的答案已经更新到到\(d(u,i),sz(u,i)\)里面

枚举\(i,j\)分别为\(v\)之前的子树距离\(u\)模\(k\)为\(i\)的路径,和子树\(v\)中距离\(u\)模\(k\)为\(j\)的路径

两边各选一段路拼起来,可以通过公式快速求得答案,细节不再赘述

最终时间复杂度为\(O(k^2n)\)

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; typedef long long LL; const int maxn = 200000 + 10; vector<int> G[maxn]; int n, k, sz[maxn][5];
LL d[maxn][5], ans; void dfs(int u, int fa) {
int tsz[5];
LL td[5];
for(int v : G[u]) if(v != fa) {
dfs(v, u);
memset(tsz, 0, sizeof(tsz));
for(int i = 0; i < k; i++) tsz[(i+1)%k] += sz[v][i]; memset(td, 0, sizeof(td));
for(int i = 1; i < k; i++) td[(i+1)%k] += d[v][i];
td[1%k] += d[v][0] + sz[v][0]; for(int i = 0; i < k; i++) {
for(int j = 0; j < k; j++) {
int delta = (i+j+k-1)/k - (i>0) - (j>0);
ans += d[u][i] * tsz[j] + td[j] * sz[u][i];
if(delta) ans += (LL) delta * sz[u][i] * tsz[j];
}
} for(int i = 0; i < k; i++) { d[u][i] += td[i]; sz[u][i] += tsz[i]; }
}
for(int i = 0; i < k; i++) ans += d[u][i];
sz[u][0]++;
} int main()
{
scanf("%d%d", &n, &k);
for(int i = 1; i < n; i++) {
int u, v; scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
} dfs(1, 0); printf("%lld\n", ans); return 0;
}

CodeForces 771C Bear and Tree Jumps 树形DP的更多相关文章

  1. Codefoces 791D. Bear and Tree Jumps 树形DP

    D. Bear and Tree Jumps   A tree is an undirected connected graph without cycles. The distance betwee ...

  2. Educational Codeforces Round 67 E.Tree Painting (树形dp)

    题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...

  3. CodeForces 161D Distance in Tree【树形DP】

    <题目链接> 题目大意:一颗无向无环树,有n个顶点,求其中距离为k的点对数是多少,(u,v)与(v,u)为同一点对. #include <cstdio> #include &l ...

  4. Codeforces 791D Bear and Tree Jump(树形DP)

    题目链接 Bear and Tree Jumps 考虑树形DP.$c(i, j)$表示$i$最少加上多少后能被$j$整除. 在这里我们要算出所有$c(i, k)$的和. 其中$i$代表每个点对的距离, ...

  5. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  6. Codeforces 804D Expected diameter of a tree(树形DP+期望)

    [题目链接] http://codeforces.com/contest/804/problem/D [题目大意] 给你一个森林,每次询问给出u,v, 从u所在连通块中随机选出一个点与v所在连通块中随 ...

  7. codeforces 161 D. Distance in Tree(树形dp)

    题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...

  8. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...

  9. [CF791D]Bear and Tree Jumps

    题目描述 A tree is an undirected connected graph without cycles. The distance between two vertices is th ...

随机推荐

  1. ansible使用1-安装&配置

    参考文档 http://docs.ansible.com https://github.com/leucos/ansible-tuto 控制机安装 ansible控制机通过ssh控制远程主机,远程主机 ...

  2. 用户管理的设计--3.jquery的ajax实现二级联动

    页面效果 实现步骤 1.引入struts整合json的插件包 2.页面使用jquery的ajax调用二级联动的js //ajax的二级联动,使用选择的所属单位,查询该所属单位下对应的单位名称列表 fu ...

  3. vos忙时闲时费率不一样怎么设置

    问题: 现有一客户要求上午闲时由原来的9:00追加到9:30 即: 9:30——12:00为忙时 14:00——18:00为忙时 其他为闲时 忙时费率为0.04元即4分 闲时费率为0.025元即2分5 ...

  4. kubernetes组件helm

    1.安装helm Helm由客户端helm命令行工具和服务端tiller组成,Helm的安装十分简单. 下载helm命令行工具到master节点node1的/usr/local/bin下(只需要在其中 ...

  5. JavaScript 面向对象编程(三):非构造函数对象的继承

    JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...

  6. 双击易语言没有反应,按住shift再双击可解决

    参考资料:http://tieba.baidu.com/p/2987732743 的7楼.

  7. 在你的andorid设备上运行netcore (Linux Deploy)

    最近注意到.net core 的新版本已经开始支持ARM 平台的CPU, 特意去Linux Deploy 中尝试了一下,真的可以运行 Welcome to Ubuntu 16.04 LTS (GNU/ ...

  8. STM32-开发环境搭建-STM32CubeMX-安装及配置

    STM32CubeMX系列教程之1.流水灯 刚刚接触到STM32CubeMX软件,感觉挺有意思,动动鼠标使STM32开发变得简单,特写文与大家分享.但具体性能如何还需测试. 硬件开发中的流水灯相当于软 ...

  9. SQL-常用数据类型

    整数除了 INT 外,还有 TINYINT.SMALLINT.MEDIUMINT.BIGINT. CHAR 和 VARCHAR 的区别: CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化 ...

  10. IOS 解析Json数据(NSJSONSerialization)

    ● 什么是JSON ● JSON是一种轻量级的数据格式,一般用于数据交互 ● 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除 外) ● JSON的格式很像OC中的字典和数组 ...