题目:传送门
题意:
给一个树,查询结点下的子树的苹果总数,并且要求支持增减苹果
题解:
查询子树,我们首先想到的是DFS序,还要支持修改操作,我们可以用树状数组维护这个DFS序,因为还要查询,所以我在实际程序中使用了欧拉序。
AC代码:
#include <iostream>
#include <vector>
#include <cstdio>
#define debug(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 100010;
vector<vector<int> > g(maxn);
//vector<int> g[maxn]这么写会TLE 虽让我也不知道为什么
int step, start_dfs[maxn], end_dfs[maxn], f[maxn];
void dfs(int u) {
start_dfs[u] = step;
for (vector<int>::iterator iter = g[u