例题
苹果树
题目描述
在附中有一棵苹果树,苹果产量特别高,这棵树有n个分叉点,并且它们之间有树枝相连,将这些分叉点编号,并且树根一直都是1,苹果会长在枝条的分叉点上面,且不会有两个苹果结在一起。你想要对它进行统计,但是有些小朋友会摘掉其中的一些苹果,而有的时候,苹果又会长出来。
于是我们定义两种操作:
C x
表示编号为x的分叉点的状态被改变(原来有苹果的话,就被摘掉,原来没有的话,就结出一个苹果)
Q x
查询编号为x的分叉点所代表的子树中有多少个苹果
我们假定一开始的时候,树上全都是苹果,也包括作为根结点的分叉1。
输入
第一行一个数N (n<=100000)
接下来n-1行,每行2个数u,v,表示分叉点u和分叉点v是直接相连的。
再接下来一行一个数M,(M<=100000)表示询问数
接下来M行,表示询问,询问的格式如题目所述Q x或者C x
输出
对于每个Q x的询问,请输出相应的结果,每行输出一个
样例输入
3
1 2
1 3
3
Q 1
C 2
Q 1
样例输出
3
2
提示
数据范围
20%:n<=100
40%:n<=3000
100%:n<=100000
分析
会变化的树型结构求和,树状数组+dfs序。
代码
先说说dfs序的代码。
void dfs(int u)
{
inn[u]=++timee;//入栈时间
id[u]=timee;//在dfs序中的序号
vis[u]=1;//标记入栈
for(int i=head[u]; i!=-1; i=e[i].nxt)
{
int v=e[i].to;
if(!vis[v])dfs(v);
}
outt[u]=timee;//出站时间
}
正解代码
#include<bits/stdc++.h>
using