题目大意:一棵树(不一定是二叉树!!),树的节点上本来都有一个苹果,要求完成以下操作:

1.指定某个节点,如果这个节点原本有苹果则拿去,如果没有苹果则填上一个苹果

2.询问某个节点以及其子树一共有多少个苹果

思路:dfs这棵树,记录下第一次到达这个节点的时间以及遍历离开的时间,于是一个节点就成了一个区间,左端点和右端点分别是开始遍历的时间和结束遍历的时间,区间里夹着的就是这个节点的子树!!区间端点记录有没有苹果,这样问题就变成了询问一个区间和的问题,而加减苹果就是对区间端点+1和-1 这两个操作都能用树状数组解决

#include<cstdio>

#include<string.h>

#include<iostream>

#define maxn 200009

using namespace std;

intnow=0,tree[maxn]={0},n,next[maxn]={0},root[maxn]={0},edge[maxn]={0},start[maxn]={0},end[maxn]={0};

int lowbit(int x){return x &(-x);}

void add(int x,int c)

{

while (x<=2*n)

{

tree[x]+=c;

x+=lowbit(x);

}

}

int get(int x)

{

int sum=0;

for(int i=x;i>=1;i=i-lowbit(i))sum+=tree[i];

return sum;

}

void addedge(int x,int y)

{

next[++now]=root[x];

edge[now]=y;

root[x]=now;

}

void dfs(int j)

{

start[j]=++now;

for(int i=root[j];i!=0;i=next[i])dfs(edge[i]);

end[j]=++now;

}

int main()

{

int x,y,m,ope,flag;

char ch[2];

scanf("%d",&n);

for(int i=1;i<=n-1;i++)

{

scanf("%d%d",&x,&y);

addedge(x,y);

}

now=0;

dfs(1);

for(int i=1;i<=2*n;i++)

add(i,1);

scanf("%d",&m);

for(int i=1;i<=m;i++)

{

scanf("%s%d",ch,&ope);

if (ch[0]=='Q')

{

printf("%d\n",(get(end[ope])-get(start[ope]-1))>>1);

}

else

{

flag=get(end[ope])-get(end[ope]-1);

if (flag==1)flag=-1;else flag=1;

add(start[ope],flag);

add(end[ope],flag);

}

}

return 0;

}

调试结果:1次AC

POJ3321Apple Tree【dfs 树状数组】的更多相关文章

  1. CF Edu54 E. Vasya and a Tree DFS+树状数组

    Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...

  2. POJ 3321 Apple Tree (DFS + 树状数组)

    题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...

  3. C++-POJ3321-Apple Tree[数据结构][树状数组]

    树上的单点修改+子树查询 用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了 #include <set> #include <map> #i ...

  4. poj3321Apple Tree(树状数组)

    http://poj.org/problem?id=3321 刚一看题以为要建一颗树 看了下讨论说dfs 这里dfs遍历时设的标号很好 一个low一个high 包含了以这一节点为根节点的子树结点的所有 ...

  5. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

  6. Weak Pair (dfs+树状数组)

    Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...

  7. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  9. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

随机推荐

  1. ubuntu用户自定义的命令alias永久生效

    cd ~ vi .bash_profile alias ll='ls -ltr' . .bash_profile ps:写在.bashrc终端断开就没了

  2. Array(数组)的基本方法

    1.定义:var   arr=new  Array ("12" , "zhang") 2.简写:var   arr=[ 12 , "zhang&quo ...

  3. Xilinx器件原语

    原语,其英文名为primitive,是FPGA厂商针对其器件特征开发的一系列常用模块的名称.原语是FPGA芯片中基本元件,代表FPGA中实际拥有的硬件逻辑单元,如LUT,D触发器,RAM等.相当于软件 ...

  4. hdu 3232 Crossing Rivers 过河(数学期望)

    题意:你在点A,目的地是点B,A和B的距离为D.中间隔了好多条河(所有河不会重叠),每条河有3个参数(P,L,V),其中P表示距离A点的长度,L表示河的长度,V表示河里的船的速度.假设每条河中仅有1条 ...

  5. 迅为4412开发平台Zigbee模块在物联网智能家居中的应用

      物联网智能家居的发展物联网随着互联网的发展,可以通过互联网实现物和物的互联,就有了物联网的概念.传统家居电器 有了物联网之后,在家居电器范围中,就是通过物联网技术将家中的各种设备连接到一起,家居中 ...

  6. nginx 安全配置文档

    1.配置文档中有多处明确写出了nginx的配置文件路径,该路径是测试环境中的路径,线上系统的nginx配置文件与文档中所写的路径可能不一样,在进行相关配置时,应以线上配置文件的实际路径为准. 线上系统 ...

  7. uva1153 Keep the Customer Satisfied

    贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可.再处理一下空队列的情况.很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成 ...

  8. zabbix设置发送消息的时间

    需求:比如我有两个报警的媒介:邮件和微信,但是下班之后,晚上我不希望手机一直响,打扰我睡觉,邮件无所谓,可以24h发送 分析:那现在就需要把微信分时间段发送:比如06:00-24:00   这个时间点 ...

  9. js 数组过滤 filter

    let res = this.list.filter(item => routeEqual(this.currentRouteObj, item) || item.name === this.$ ...

  10. sklearn之SVC

    sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability= ...