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

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. Apache Cordova

    http://cordova.apache.org/ Apache Cordova is a platformfor building native mobile applications using ...

  2. LinQ的使用

    LinQ:LinQ to Sql类 它是一个集成化的数据访问类,微软将原本需要我们自己动手去编写的一些代码,集成到了这个类中,会自动生成. LinQ的创建: 添加项——添加新项(LinQ to Sql ...

  3. pandas中loc-iloc-ix的使用

    转自:https://www.jianshu.com/p/d6a9845a0a34 Pandas中loc,iloc,ix的使用 使用 iloc 从DataFrame中筛选数据 iloc 是基于“位置” ...

  4. (转)关于IC设计的想法 Author :Fengzhepianzhou

    一.工具的使用 工欲善其事,必先利其器.我们做IC设计的需要掌握的工具:仿真(vcs.modelsim),综合工具(dc.QS.ISE),时序分析(pt.其他的).以及后端的一些工具,比如astro. ...

  5. Java JDK装配置

     1- 介绍 本文章介绍JAVA开发环境安装是基于:  Java8(JDK8) 2- 下载JDK http://www.oracle.com/technetwork/java/javase/dow ...

  6. 求N个数的最大公约数

    使用 “辗转相除法” 计算2个数的最大公因数: int GCD_2(int nNum1, int nNum2) { if (nNum1 > nNum2) { nNum1 = nNum1 ^ nN ...

  7. 记一次mysql优化操作

    这次操作,起因是需要获取用户来源及用户性别,而用户的性别信息在第三方授权的中有,存为JSON格式, 不想用php去解析获取,所以试试mysql操作 如果你有更好的解决方案,请留言告诉我! 情景简化 表 ...

  8. mysql 表锁死的问题

    select * from information_schema.innodb_trx; kill 34863;kill 34856;kill 34860;kill 34859;kill 34845; ...

  9. dom和bom是什么?

    DOM:文档对象模型,描述了处理网页内容的方法和接口.最根本对象是document(window.document). 由于DOM的操作对象是文档,所以DOM和浏览器没有直接关系. 部署在服务器上的文 ...

  10. environ - 用户环境(变量)

    SYNOPSIS 总览 extern char **environ; DESCRIPTION 描述 变量 environ 指向的是一个叫 'environment'(环境)的字符串数组 (这个变量必须 ...