给你一棵 \(n\) 个点的树,点带权,对于每个节点求出距离它不超过 \(k\) 的所有节点权值和 \(m_i\)

随便定一个根,设\(f[i][j]\)表示只考虑子树,距离为\(j\)的权值和,\(g[i][j]\)表示考虑子树和父树,距离为\(j\)的权值和,显然答案可以用\(g\)表示

\(f[p][0]=w[p]\)

\(f[p][k]=\sum f[q][k-1]\)

\(g[1][k]=f[1][k]\)

\(g[p][0]=w[p]\)

对\(g\)的计算,考虑容斥

\[g[q][k] =\sum( f[q][k] + g[p][k-1] - f[q][k-2])
\]

注意特判掉\(k=1\)

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 100005;
vector <int> G[N];
int n,k,vis[N],f[N][22],g[N][22],w[N]; void dfs1(int p) {
vis[p]=1;
for(int i=0;i<G[p].size();i++) {
int q=G[p][i];
if(vis[q]) continue;
dfs1(q);
for(int j=1;j<=k;j++)
f[p][j]+=f[q][j-1];
}
} void dfs2(int p) {
vis[p]=1;
for(int i=0;i<G[p].size();i++) {
int q=G[p][i];
if(vis[q]) continue;
for(int j=1;j<=k;j++)
g[q][j]+=f[q][j]+g[p][j-1]-(j>1?1:0)*f[q][j-2];
dfs2(q);
}
} signed main() {
scanf("%lld%lld",&n,&k);
for(int i=1;i<n;i++) {
int t1,t2;
scanf("%lld%lld",&t1,&t2);
G[t1].push_back(t2);
G[t2].push_back(t1);
}
for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
for(int i=1;i<=n;i++) f[i][0]=g[i][0]=w[i];
dfs1(1);
for(int i=1;i<=k;i++) g[1][i]=f[1][i];
memset(vis,0,sizeof vis);
dfs2(1);
for(int i=1;i<=n;i++) {
int ans = 0;
for(int j=0;j<=k;j++) ans+=g[i][j];
printf("%lld\n",ans);
}
}

[USACO12FEB] 附近的牛 Nearby Cows - 树形dp,容斥的更多相关文章

  1. luogu 3047 [USACO12FEB]附近的牛Nearby Cows 树形dp

    $k$ 十分小,直接暴力维护 $1$~$k$ 的答案即可. 然后需要用父亲转移到儿子的方式转移一下. Code: #include <bits/stdc++.h> #define M 23 ...

  2. [luoguP3047] [USACO12FEB]附近的牛Nearby Cows(DP)

    传送门 dp[i][j][0] 表示点 i 在以 i 为根的子树中范围为 j 的解 dp[i][j][1] 表示点 i 在除去 以 i 为根的子树中范围为 j 的解 状态转移就很好写了 ——代码 #i ...

  3. 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...

  4. 洛谷P3047 [USACO12FEB]Nearby Cows(树形dp)

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  5. 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  6. 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

  7. [USACO12FEB]附近的牛Nearby Cows

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

  8. LUOGU P3047 [USACO12FEB]附近的牛Nearby Cows

    传送门 解题思路 树形dp,看到数据范围应该能想到是O(nk)级别的算法,进而就可以设出dp状态,dp[x][j]表示以x为根的子树,距离它为i的点的总和,第一遍dp首先自底向上,dp出每个节点的子树 ...

  9. [JSOI2019]神经网络(树形DP+容斥+生成函数)

    首先可以把题目转化一下:把树拆成若干条链,每条链的颜色为其所在的树的颜色,然后排放所有的链成环,求使得相邻位置颜色不同的排列方案数. 然后本题分为两个部分:将一棵树分为1~n条不相交的链的方案数:将这 ...

随机推荐

  1. 复杂系统架构设计<1>

    这两天开始读由Edward Crawley(爱德华 克劳利).Bruce Cameron(布鲁斯 卡梅隆).Daniel Selva(丹尼尔 塞尔瓦)著作的系统架构,一开始看目录以为是介绍系统软件架构 ...

  2. 在C#下使用TensorFlow.NET训练自己的数据集

    在C#下使用TensorFlow.NET训练自己的数据集 今天,我结合代码来详细介绍如何使用 SciSharp STACK 的 TensorFlow.NET 来训练CNN模型,该模型主要实现 图像的分 ...

  3. Html介绍,了解html代码的注释

    什么是代码注释?在代码编辑器中的注释代码是不会在浏览器窗口展示的!html代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你之前编写的代码,很快可以想起这个代码的用途.代码注释不仅方便程序员 ...

  4. RHEL7开机不能正常进入系统(图形化界面)

    今天在重启RHEL7的虚拟机后一直无法正常开机,一直提示输入管理员密码,如下图所示: 输入密码后进入命令行模式,经排查出现此现象的问题是在挂载银盘的时候文件格式写错,在格式化硬盘的时候格式化的是xfs ...

  5. 安装NTP到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Docker 17.12.1-ce 硬件要求:无 安装过程 1.安装YUM-EPEL存储库 YU ...

  6. python文件操作汇总day7

    Python处理文件 文件操作分为读.写.修改,我们先从读开始学习 读文件 示例1: f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',enc ...

  7. maven的核心概念——坐标

    7.1 几何中的坐标 [1]在一个平面中使用x.y两个向量可以唯一的确定平面中的一个点. [2]在空间中使用x.y.z三个向量可以唯一的确定空间中的一个点. 7.2 Maven的坐标 使用如下三个向量 ...

  8. 【剑指Offer】58:二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题解一:递归 //既然给了二叉树的某个结点,且二叉树存 ...

  9. 【终端使用】用户权限和"chmod"命令的简单使用

    一.用户权限知识点 1.1.基本概念 用户是Linux系统工作中重要的一环,用户管理包括 用户管理 和 组管理. 在Linux系统中,不论由本机登录系统 或者 远程登录系统,每个系统都必须拥有一个账号 ...

  10. Spark学习之路 (四)Spark的广播变量和累加器[转]

    概述 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本.这些变量会被复制到每台机器上,并 ...