Codeforces Round #660 (Div. 2) C. Uncle Bogdan and Country Happiness ###K ###K //K

题目链接:https://codeforces.ml/contest/1388/problem/C

题意:给一棵根为1的树 m个人,开始都在根节点,每晚这些人都要回到自己的住处,回去的路上随时可以心情变坏

但是变坏了就不能变好  为是否存在一种情况 满足所有点 h[i]成立 h[i]=心情好的人数-心情坏的人数

 

每个人开始的心情是可以自己设定的,这点要读出来

 

思路:首先考虑的是假设条件然后判断是否成立,在树上,如果是从上而下的check的话 连通过当前点的总人数都无法确定

所以考虑从底往上来check    假设zong 为通过该点的总人数 列方程可知 good-bad=h  good+bad=zong   可知2*good=(zong+h)

所以zong+h 必须为偶数才能满足条件  还有就是good不能大于zong  abs(h)也不能大于总   还有题目的条件good[u]<good[v]

当时写错的原因是 判断good[u]<good[v]的时候  应该判断的是所有子节点的总good[v]   而自己只是一个一个的判断 没有将子节点的累加起来 *2

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define pb push_back
 6 const int maxn=1e5+10;
 7 const int mod=1e9+7;
 8 
 9 int n,m;
10 int p[maxn];
11 int h[maxn];
12 vector<int>E[maxn];
13 int good[maxn];
14 int zong[maxn];
15 
16 int f;
17 void init()
18 {
19     f=0;
20     for(int i=0;i<=n;i++)
21     {
22         E[i].clear();
23         zong[i]=0;
24         good[i]=0;
25     }
26 }
27 void dfs(int u,int fa)
28 {
29     int sum=0;
30     for(auto &v:E[u])
31     {
32         if(v==fa)
33             continue;
34         dfs(v,u);
35         zong[u]+=zong[v];
36         sum+=good[v];
37     }
38     zong[u]+=p[u];
39     int k=zong[u]+h[u];
40     if(k%2||abs(h[u])>zong[u]) f=1;
41     good[u]=(h[u]+zong[u])/2;
42     if(good[u]<sum)
43         f=1;
44 }
45 
46 
47 
48 int main()
49 {
50     ios::sync_with_stdio(false);
51     cin.tie(0);
52     int t;
53     cin>>t;
54     while(t--)
55     {
56         cin>>n>>m;
57         init();
58         for(int i=1;i<=n;i++)
59         {
60             cin>>p[i];
61         }
62         for(int i=1;i<=n;i++)
63         {
64             cin>>h[i];
65         }
66         for(int i=1;i<n;i++)
67         {
68             int x,y;
69             cin>>x>>y;
70             E[x].pb(y);
71             E[y].pb(x);
72         }
73         dfs(1,0);
74         if(f)
75             cout<<"NO"<<'\n';
76         else
77             cout<<"YES"<<'\n';
78 
79     }
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 }
View Code

 

posted @ 2020-08-01 10:53  canwinfor  阅读(181)  评论(0)    收藏  举报