dfs序(+树状数组)

这是一篇关于如何利用dfs序和树状数组解决动态维护苹果树上苹果数量的问题。首先介绍了一个苹果树的例题,树上有n个分叉点,存在两种操作:C x(改变分叉点x的状态,即添加或移除苹果)和Q x(查询分叉点x的子树中苹果总数)。接着分析了问题,指出这是一个会变化的树型结构求和问题,适合用树状数组配合dfs序来解决。最后,提供了正解代码片段。
摘要由CSDN通过智能技术生成

例题

苹果树
题目描述
在附中有一棵苹果树,苹果产量特别高,这棵树有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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值