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 }

浙公网安备 33010602011771号