对于一个点,它被它的k级父亲覆盖肯定是最优的。
f[i][j] :i这个点的子树中和它距离为j的待灭点数。
g[i][j]:i这个点的子树中和它距离为j的灭火器能灭点数。
f[i][k]:一定是在i这里灭是最优的,因为相距k.
对于与i相距z的的灭火器(所在点)d2和与i相距w的待灭点d1,如果z + w = k或z + w = k-1(如果再往上走d1,d2就相距k+1就灭不到了)。如果灭火器还能灭,就灭。//每次找距离为k,k-1的,贪心思想,其实i是d1和d2的lca)
对于根来说我们能灭就灭。也就是d1 + d2 < = k 就灭。//距离根小与k的没有k级父亲啊,不能被他的k级父亲灭啊,贪心不了。
再统计有多少灭不了的,加灭火器。
#include<bits/stdc++.h>
using namespace std;
int tp, tov[200005], nex[200005], h[100005], n, s, k, f[100005][22], g[100005][22],