题目描述

Farmer John has noticed that his cows often move between nearby fields. Taking this into account, he wants to plant enough grass in each of his fields not only for the cows situated initially in that field, but also for cows visiting from nearby fields.

Specifically, FJ's farm consists of N fields (1 <= N <= 100,000), where some pairs of fields are connected with bi-directional trails (N-1 of them in total). FJ has designed the farm so that between any two fields i and j, there is a unique path made up of trails connecting between i and j. Field i is home to C(i) cows, although cows sometimes move to a different field by crossing up to K trails (1 <= K <= 20).

FJ wants to plant enough grass in each field i to feed the maximum number of cows, M(i), that could possibly end up in that field -- that is, the number of cows that can potentially reach field i by following at most K trails. Given the structure of FJ's farm and the value of C(i) for each field i, please help FJ compute M(i) for every field i.

给出一棵n个点的树,每个点上有C_i头牛,问每个点k步范围内各有多少头牛。

输入输出格式

输入格式:

  • Line 1: Two space-separated integers, N and K.

  • Lines 2..N: Each line contains two space-separated integers, i and j
    (1 <= i,j <= N) indicating that fields i and j are directly
    connected by a trail.

  • Lines N+1..2N: Line N+i contains the integer C(i). (0 <= C(i) <= 1000)

输出格式:

  • Lines 1..N: Line i should contain the value of M(i).

输入输出样例

输入样例#1:

6 2
5 1
3 6
2 4
2 1
3 2
1
2
3
4
5
6
输出样例#1:

15
21
16
10
8
11

说明

There are 6 fields, with trails connecting (5,1), (3,6), (2,4), (2,1), and (3,2). Field i has C(i) = i cows.

Field 1 has M(1) = 15 cows within a distance of 2 trails, etc.

思路

树形DP+容斥原理;

代码实现

 #include<cstdio>
const int maxn=1e5+;
const int maxm=2e5+;
int n,m;
int f[maxn][],ft[maxn];
int s[maxn],ans[maxn];
int h[maxn],hs;
int et[maxm],en[maxm];
void add(){
int a,b;
scanf("%d%d",&a,&b);
et[++hs]=b,en[hs]=h[a],h[a]=hs;
et[++hs]=a,en[hs]=h[b],h[b]=hs;
}
void dfs(int k,int fa){
ft[k]=fa;
for(int i=;i<=m;i++) f[k][i]+=s[k];
for(int i=h[k];i;i=en[i])
if(et[i]!=fa){
dfs(et[i],k);
for(int j=;j<=m;j++){
f[k][j]+=f[et[i]][j-];
}
}
}
int lca(int k,int son,int now){
int ret=;
while(k&&now>=){
ret-=f[son][now-],ret+=f[k][now];
son=k,k=ft[son],now--;
}
return ret;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) add();
for(int i=;i<=n;i++) scanf("%d",&s[i]);
dfs(,);
for(int i=;i<=n;i++){
printf("%d\n",lca(ft[i],i,m-)+f[i][m]);
}
return ;
}

[USACO12FEB]附近的牛Nearby Cows的更多相关文章

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

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

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

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

  3. 【洛谷3047】[USACO12FEB]附近的牛Nearby Cows

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

  4. 【题解】Luogu p3047 [USACO12FEB]附近的牛Nearby Cows 树型dp

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

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

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

  6. P3047 [USACO12FEB]附近的牛Nearby Cows

    https://www.luogu.org/problemnew/show/P304 1 #include <bits/stdc++.h> 2 #define up(i,l,r) for( ...

  7. 【[USACO12FEB]附近的牛Nearby Cows】

    我记得我调这道题时中耳炎,发烧,于是在学长的指导下过了也没有发题解 发现我自己的思路蛮鬼畜的 常规操作:\(f[i][j]\) 表示到\(i\)的距离为\(j\)的奶牛有多少只,但注意这只是在第二遍d ...

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

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

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

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

随机推荐

  1. 222 Count Complete Tree Nodes 完全二叉树的节点个数

    给出一个完全二叉树,求出该树的节点个数.完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置.若最底层为第 h ...

  2. AJPFX学习Java函数知识总结

    函 数:为了提高代码的复用性,可以将其定义成一个单独的功能,该功能的体现就是java中的函数.函数就是体现之一. java中的函数的定义格式:         修饰符 返回值类型 函数名(参数类型 形 ...

  3. 客户端负载均衡 - Ribbon

    Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP.TCP的客户端负载均衡器. 服务端负载均衡 负载均 ...

  4. 腾讯云COS对象存储的简单使用

    叮当哥之前买了一年的腾讯云服务器,昨日偶然发现腾讯云送了叮当哥半年的cos对象存储服务器,于是就撸起袖子传了几张珍藏的高清大图上去,现将其上传的简单使用步骤总结一波(其它操作参加官方SDK文档API) ...

  5. swiper4实现的拥有header和footer的全屏滚动demo/swiper fullpage footer

    用swiper4实现的拥有header和footer的全屏滚动demo, <!DOCTYPE html> <html lang="en"> <head ...

  6. "CSRF token missing or incorrect."的解决方法.

    现象: Forbidden (403)CSRF verification failed. Request aborted.HelpReason given for failure:CSRF token ...

  7. Android学习笔记(八) CheckBox和RadioGroup

    一.CheckBox 1.CheckBox的常用方法: boolean isChecked() :返回当前CheckBox的选中状态 void setChecked(boolean isChecked ...

  8. 面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.ut ...

  9. github——团队合作

  10. CE工具里自带的学习工具--第一关

    点击[下一步],进入第二关