[树形dp+贪心]黑白树

it2023-07-05  64

题目:黑白树

分析:

叶子结点一定选,从下往上,对于当前u维护一个如果再选一个子节点能够往上最远的距离maxlen,和不选u能够向上到达的最远距离nowlen。当nowlen=0时,就不得不选一个点(这里我们不关心选了哪个点),使得nowlen = maxlen

代码:

#include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) #define mem(a, b) memset(a, b, sizeof(a)) #define pb(a) push_back(a) #define x first #define y second typedef pair<int, int> par; const ll mod = 1e9 + 7; const int maxn = 1e6 + 10; const int inf = 0x3f3f3f3f; vector<int> g[maxn]; int maxlen[maxn], nowlen[maxn]; int ans; void dfs(int u) { for(auto v : g[u]) { dfs(v); maxlen[u] = max(maxlen[u], maxlen[v] - 1); nowlen[u] = max(nowlen[u], nowlen[v] - 1); } if(!nowlen[u]) { ans++; nowlen[u] = maxlen[u]; } } int main() { int n; cin >> n; for(int i = 2; i <= n; i++) { int x; cin >> x; g[x].pb(i); } for(int i = 1; i <= n; i++) cin >> maxlen[i]; dfs(1); cout << ans << endl; }
最新回复(0)