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 
#include 
#include 
#include 
#include 
#include 

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;
}

 

你可能感兴趣的:(CF#660 C - Uncle Bogdan and Country Happiness)