题意: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; }