【题目描述】:
就是说有一棵二叉树,每个节点上面有一个权值,这个权值只可能是0或者是1。首先给你这棵树,然后进行M次操作:
C X 表示将编号为x的节点的权值改变(就是1-->0,0-->1)
Q X表示查询以X为根的子树上权值的和。
(N<=100000,M<=100000)
【题目分析】:
这个题数据量一看就是奇大的那一种,肯定必须要用Nlogn或是N的强悍算法~然后我们发现这个题可以这样想:对于DFS的时间戳来说,我记录入栈的时间,和出栈的时间,这中间出栈的节点一定是这个子树上的节点,所以我们会发现,实际上是维护一个连续段上的和的问题。可以用的方法有线段树还有树状数组。
我用的是树状数组,程序分为3步:
STEP1 读入,建树
STEP2 DFS(注意:入栈的时间是当前的time+1,而这个time只在有东西出栈的时候才往上加[想一想为什么呢~])
STEP3 利用树状数组维护性质和完成询问。
【代码】: