我记得我调这道题时中耳炎,发烧,于是在学长的指导下过了也没有发题解

发现我自己的思路蛮鬼畜的

常规操作:\(f[i][j]\) 表示到\(i\)的距离为\(j\)的奶牛有多少只,但注意这只是在第二遍dfs之后

在我的第一遍dfs中(就是下面那个叫build的函数),\(f[i][j]\)的含义是在i这课子树中到\(i\)的距离为\(j\)的奶牛有多少只,所以在第一遍dfs的时候,\(f[i][j]\)的状态只会来自它的儿子们

于是在第一遍dfs就有一个异常简单的方程

\[f[i][j]=\sum_{}f[k][j-1]
\]

其中\(k\)是 \(i\)的儿子

如果我们钦定以1为根建树的话,那么1的子树就是整棵树,于是这个时候的\(f[1]\)就是全树意义下的答案了

而这个时候第二遍dfs就要登场了,第二遍dfs的意义就是利用父亲去更新儿子,于是我们就又有一个简单的方程了

\[f[k][j]=\sum_{}f[i][j-1]
\]

其中\(k\)是 \(i\)的儿子

这样的话肯定会有重复的,因为到\(i\)的距离为2的点包含到\(k\)距离为1的k的儿子们,而这些点位于\(k\)的子树中的点已经在第一遍dfs的时候被加上了,于是我们在这里简单容斥就好了

于是就是代码了

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100001
using namespace std;
struct node
{
int v,nxt;
}e[maxn<<1];
int f[maxn][21],s[maxn],head[maxn],deep[maxn];
int n,num,k;
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x;
}
inline void add(int x,int y)
{
e[++num].v=y;
e[num].nxt=head[x];
head[x]=num;
}
inline void build(int r)
{
for(re int i=head[r];i;i=e[i].nxt)
if(!deep[e[i].v])
{
deep[e[i].v]=deep[r]+1;
build(e[i].v);
for(re int j=1;j<=k;j++)
f[r][j]+=f[e[i].v][j-1];
}
}
inline void dfs(int r)
{
for(re int i=head[r];i;i=e[i].nxt)
if(deep[e[i].v]>deep[r])
{
for(re int j=k;j>=2;j--)
f[e[i].v][j]-=f[e[i].v][j-2];//简单的容斥原理了
//这里的循环一定要倒序
for(re int j=1;j<=k;j++)
f[e[i].v][j]+=f[r][j-1];
dfs(e[i].v);
}
}
int main()
{
n=read();
k=read();
int x,y;
for(re int i=1;i<n;i++)
{
x=read();
y=read();
add(x,y);
add(y,x);
}
for(re int i=1;i<=n;i++)
s[i]=read(),f[i][0]=s[i];
deep[1]=1;
build(1);
dfs(1);
for(re int j=1;j<=n;j++)
{
int ans=0;
for(re int i=0;i<=k;i++)
ans+=f[j][i];
printf("%d\n",ans);
}
}

【[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. [USACO12FEB]附近的牛Nearby Cows

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

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

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

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

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

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

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

  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. location.false(true)

    location.reload()意思是从服务器端重新载入页面 ; location.false(true)意思是从缓存中重新载入.

  2. .Net程序员玩转Android系列之二~Android Framework概要(1)

    从windows操作系统说起 人们总是喜欢从将陌生的事物和自己所了解的东西关联起来,以加深对未知事物的了解,这一讲我们从windows操作系统说起,逐步引领带大家走入android的世界.写任何程序都 ...

  3. sql server分页查询

    1.引言 在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页. 2.常用的数据分页方法 ...

  4. JAVA学习之路(多线程)---模拟售票(细解)

    首先看题目描述: 假设有火车票100张,创建4个线程模拟4个售票点,每100ms售出一张,打印出售票过程,格式如下: 窗口3:卖出第100张票 窗口4:卖出第99张票 ............ ... ...

  5. 快速搭建maven私服 Artifactory on Docker

    1.下载官方镜像 docker pull docker.bintray.io/jfrog/artifactory-oss:latest 2.启动容器 docker run --name artifac ...

  6. 第8章 CSS3中的变形与动画(上)

    变形--旋转 rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时 ...

  7. HTML总结摘要

    一 概述 1.什么是HTML? HyperText Markup Language,超文本标记语言,客户端技术的技术,负责页面展示. 2.HTML的特点 标签不区分大小写. 3.请求地址 HTML是客 ...

  8. 【One Day菜鸟到大鸟】MyBatis搭建环境

    一.概述     MyBatis是一个持久化框架和Hiberante差不多.比起JDBC来说MyBatis封装了JDBC让我们能够面向对象开发.比起Hiberante来说卸下了Hiberante那种重 ...

  9. Codeforces Round #413 A. Carrot Cakes

    A. Carrot Cakes time limit per test   1 second memory limit per test   256 megabytes   In some game ...

  10. ANN神经网络——实现异或XOR (Python实现)

    一.Introduction Perceptron can represent AND,OR,NOT 用初中的线性规划问题理解 异或的里程碑意义 想学的通透,先学历史! 据说在人工神经网络(artif ...