E:https://atcoder.jp/contests/abc309/tasks/abc309_e
题意: 一颗根为1的树,第i个节点的父节点是pi,xi编号的节点可以将向下y层的节点权值+1,求最终有多少个权值>0的节点。
code:未赋值的全标记为-1,先初始化最大化标记,然后从根节点开始dfs向下转移状态,最后统计标记为非负数的节点个数即可
#include <bits/stdc++.h>
using namespace std;
int main(){
int N, M;
cin >> N >> M;
vector<int> p(N);
for (int i = 1; i < N; i++){
cin >> p[i];
p[i]--;
}
vector<int> dp(N, -1);
for (int i = 0; i < M; i++){
int x, y;
cin >> x >> y;
x--;
dp[x] = max(dp[x], y);
}
int ans = 0;
for (int i = 0; i < N; i++){ // 1≤pi≤i−1
if (i > 0){
dp[i] = max(dp[i], dp[p[i]] - 1);
}
if (dp[i] >= 0){
ans++;
}
}
cout << ans << endl;
}
F:https://atcoder.jp/contests/abc309/tasks/abc309_f
思路:
code: