洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows
2017-07-20 20:17
330 查看
题目描述
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.
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.
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 100010 struct Edge{ int to,next; }e[MAXN<<1]; int head[MAXN],n,m,w[MAXN],tot,k,fa[MAXN],f[MAXN][25]; inline void Add_Edge(int u,int v){ e[++tot].to=v;e[tot].next=head[u];head[u]=tot; } inline int read(int &x){ x=0;int f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1; c=getchar();} while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c-'0');c=getchar();} x*=f; } inline void DFS(int u,int father){ fa[u]=father;f[u][0]=w[u]; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa[u]) continue; DFS(v,u); for(int j=1;j<=k;j++) f[u][j]+=f[v][j-1]; } } inline void Calc(int u){//不懂的模拟一下 然而我模拟玩了只证明了他的正确性 求大佬指点推导 int K=k,ans=0;ans=f[u][K]; while(u!=1&&K){ K--;ans+=f[fa[u]][K]; if(K) ans-=f[u][K-1]; u=fa[u]; } printf("%d\n",ans); } int main(){ read(n);read(k); for(int u,v,i=1;i<=n-1;i++){ read(u);read(v); Add_Edge(u,v);Add_Edge(v,u); } for(int i=1;i<=n;i++) read(w[i]); DFS(1,-1); for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) f[i][j]+=f[i][j-1];//最后会有f[u][k]+=f[u][k-1] for(int i=1;i<=n;i++) Calc(i); return 0; }
相关文章推荐
- 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows
- 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows
- 树形dp-洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows
- 【洛谷3047】[USACO12FEB]附近的牛Nearby Cows
- 【洛谷3047】[USACO12FEB]附近的牛Nearby Cows
- [洛谷3047]USACO12FEB附近的牛
- [luoguP3047] [USACO12FEB]附近的牛Nearby Cows(DP)
- [USACO12FEB]附近的牛Nearby Cows
- P3047 [USACO12FEB]附近的牛Nearby Cows
- 洛谷P3048 [USACO12FEB]牛的IDCow IDs
- |洛谷|堆|P3045 [USACO12FEB]牛券Cow Coupons
- [USACO12FEB]Nearby Cows
- 洛谷P3047 [USACO12FEB]Nearby Cows(树形dp)
- [USACO12FEB]Nearby Cows
- 洛谷 P3048 [USACO12FEB]牛的IDCow IDs
- [USACO12FEB]Nearby Cows solution 题解 [洛谷3047]
- 洛谷P3048 [USACO12FEB]牛的IDCow IDs
- BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛
- 洛谷——P1208 [USACO1.3]混合牛奶 Mixing Milk
- 洛谷 P3040 [USACO12JAN]贝尔分享Bale Share