解题思路:
最直接的想法是,每次轰炸一个点时,将距离2以内的点的轰炸次数都加1,但是这可能会产生一个问题,很容易被卡,如果只有一个父亲节点,n-1个儿子节点,那么复杂度为O(n^2)
所以应该采取另外一个方法,即每次轰炸将贡献传递给父亲和爷爷还有自身,这样每次就降低了复杂度,每次次数询问时,只需查询父亲、爷爷、自身的贡献次数就行
即一个点的兄弟受到轰炸它也受到轰炸,这记录在父亲节点,一个点的爷爷受到轰炸它也受到轰炸,这记录在爷爷节点,一个点的儿子和孙子受到轰炸它也受到轰炸,这记录在节点本身。
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=750000;
int f[maxn+10];
int sum[maxn+10][3];
vector<int