1. 程式人生 > 實用技巧 >CF#660 C - Uncle Bogdan and Country Happiness

CF#660 C - Uncle Bogdan and Country Happiness

題意:n個城市(1是首都),n-1條道路相連。m個市民有好心情和壞心情。市民住在各個城市,且都在首都工作,下班回家時好心情可以變壞,但壞心情好不了,並且在城市中不會變化心情。有測幸福指數f[x]為路過城市x的所有人中好心情的人數-壞心情的人數。

要求,幸福指數測量器測量準確輸出“YES”,否則輸出“NO”

輸入:

第一行包含一個整數T(1≤t≤10000)--測試用例數。每個測試用例的第一行包含兩個整數n和m(1≤n≤105;0≤m≤109)--城市和市民的數量。每個測試用例的第二行包含n整數p1,p2,…。,pn(0≤pi≤m;p1+p2+…)+pn=MP1+p2+…+pn=m),其中pipi是居住在第二城市的人數.第三行包含nn個整數h1,h2,…。,hh 1,h2,…,HN(−109≤hi≤109−109≤hi≤109),其中hi是第i城市的計算幸福指數。接下來n-1行包含道路的描述,每一行一條。每條線都包含兩個整數,即xi和yi(1≤xi,yi≤n;xi≠yi),其中xi和yi是由第i條道路連線的城市。保證來自所有測試用例的n之和不超過2⋅105

輸入樣例:

第一組:
2
7 4 1 0 1 1 0 1 0 4 0 0 -1 0 -1 0 1 2 1 3 1 4 3 5 3 6 3 7 5 11 1 2 5 2 1 -11 -2 -6 -2 -1 1 2 1 3 1 4 3 5


第二組:
2
4 4
1 1 1 1
4 1 -3 -1
1 2
1 3
1 4
3 13
3 3 7
13 1 4
1 2
1 3

輸出:

對於每個測試用例,如果收集的資料是正確的,則列印“YES”。否則,“NO”的字元。

輸出樣例:

第一組:
YES YES

第二組:
NO
NO

題解:

dfs

城市x住的人有p[x]個,測量儀指數為h[x],路過該城市的總人數為a[x]。心情好的有good[x]人,心情不好的有bad[x]人

所以有:a[x]=good[x]+bad[x], h[x]=good[x]-bad[x]

所以有三個約束條件:

1.a[x]+h[x]可以被2整除;

2.good[x]的區間範圍為[0,a[x]];

3.父節點城市心情好的人大於子節點城市心情好的人(路過此城市後可能心情變壞,但不會變好)

程式碼:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>

using
namespace std; const int maxn = 1e6 + 5; int p[maxn], h[maxn], a[maxn], b[maxn];//a[x]是路過城市x的總人數,b[x]是路過城市x心情好的人數,h[x]是路過城市x的所有人的幸福指數 bool flag = true; vector<int>g[maxn]; void dfs(int x, int fa) { a[x] = p[x]; int sum_b = 0; for (int i = 0; i < g[x].size(); i++) { int v = g[x][i]; if (v == fa)continue; dfs(v, x); a[x] += a[v]; sum_b += b[v]; } if ((a[x] + h[x]) % 2)flag = false; b[x] = (a[x] + h[x]) / 2; if (b[x]<0 || b[x]>a[x])flag = false; if (sum_b > b[x])flag = false; } int main() { int t; cin >> t; while (t--) { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++)g[i].clear(); for (int i = 1; i <= n; i++)cin >> p[i]; for (int i = 1; i <= n; i++)cin >> h[i]; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } flag = true; dfs(1, -1); if (flag)cout << "YES" << endl; else cout << "NO" << endl; } return 0; }