题解 | #好子树#
好子树
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")
查看22道真题和解析
