题解 | #好子树#

好子树

https://www.nowcoder.com/practice/aca56bd0c9414c71b94d3a2851f4e0e7

# 使用dfs进行搜索 并记录当前子树的最大值
#

#include <algorithm>
#include <iostream>
#include <type_traits>
#include <vector>
using namespace std;

int n;
vector<int> ai;
vector<vector<int>> graph;
vector<int> res;

std::pair<int,int> dfs(int cur,int _min,int _max){
    int _cur_min = _min,_cur_max = _max;
    for(auto son : graph[cur]){
        auto t = dfs(son,_min,_max);
        _cur_min = min(_cur_min,t.first);
        _cur_max = max(_cur_max,t.second);
    }

    _max = std::max(ai[cur],_cur_max);
    _min = std::min(ai[cur],_cur_min);
    if((_max-_min)%2){
        res.push_back(cur);
    }
    return {_min,_max};
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    ai.resize(n);
    graph.resize(n);
    for(int i = 0 ; i < n ; i++){
        cin >> ai[i];
    }
    int root, sub;
    while(cin >> root && cin >> sub){
        graph[root-1].push_back(sub-1);   
    }
    dfs(0,1e9+1,0);
    std::cout << res.size() << std::endl;
    sort(res.begin(),res.end());
    for(auto it : res){
        cout << it+1 << " ";
    }
    cout << endl;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务