传送门

Solution:

我们只需要采用和树链剖分近似的思想——把整个树的dfs序整理出来,排成线型。

这样一个节点的子树肯定是连续的一段,于是乎就可以用树状数组维护单点修改+区间查询的任务了。

#include<iostream>
#include<cstdio>
#define N 100005
using namespace std;
int n,m,tot,first[N],in[N],out[N],sign,tree[N],exist[N];
struct Edge
{int to,next;
}edge[2*N];
inline void addedge(int x,int y)
{tot++;edge[tot].to=y;edge[tot].next=first[x];first[x]=tot;
}
inline void dfs(int now,int fa)
{in[now]=++sign; for(int u=first[now];u;u=edge[u].next){int vis=edge[u].to;if(vis==fa) continue;dfs(vis,now);}out[now]=sign;
}
inline int lowbit(int x)
{return x&(-x);
}
inline void update(int x,int k)
{for(int i=x;i<=n;i+=lowbit(i))  tree[i]+=k;
}
inline int query(int x)
{int ans=0;for(int i=x;i>=1;i-=lowbit(i))  ans+=tree[i];return ans;
}
int main()
{ios::sync_with_stdio(false);cin.tie(NULL),cout.tie(NULL);cin>>n;for(int i=1;i<=n-1;i++){int x,y;cin>>x>>y;addedge(x,y);addedge(y,x);}dfs(1,0);for(int i=1;i<=n;i++){update(in[i],1);exist[i]=1;}cin>>m;for(int i=1;i<=m;i++){char ch;int x;cin>>ch>>x;if(ch=='Q'){cout<<query(out[x])-query(in[x]-1)<<'\n';}if(ch=='C'){if(exist[x])    update(in[x],-1);else update(in[x],1);exist[x]^=1;}}return 0;
}

转载于:https://www.cnblogs.com/Patrickpwq/articles/9466942.html

【POJ 3321】Apple Tree(树的dfs序+树状数组)相关推荐

  1. 【线段树_DFS序】POJ 3321 Apple Tree

    POJ 3321 Apple Tree 题意:给出一个N个结点的无根树.但是要将1看作根,也相当于是一个有根树.最初每个结点都有一个苹果.有两种操作,Q x: 以x为根的子树上有多少个苹果:C x: ...

  2. POJ 3321 Apple Tree 题解

    POJ 3321 Apple Tree 题解 POJ 3321 题目 There is an apple tree outside of kaka's house. Every autumn, a l ...

  3. poj 3321 Apple Tree(dfs序+树状数组求和模型)

    题目链接:http://poj.org/problem?id=3321 解题思路: 先dfs求出序列,将子树转化到dfs序列的区间内,接下来就是简单的树状数组求和模型了.水题. #include< ...

  4. poj 3321 Apple Tree 树状数组

    http://poj.org/problem?id=3321 一棵树,开始时每个结点都有一个苹果,输入C x表示更新x结点,若x结点有苹果,把该结点苹果摘掉,若该节点无苹果,在该节点上增加一个新的苹果 ...

  5. POJ 3321 Apple Tree【树状数组】

    题目 There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tr ...

  6. poj 3321 Apple Tree

    树状数组 题意:一个树,以树枝连接两个点的形式给出,固定以1为整棵树的根.苹果长在树的节点上,节点上只可能0或1个苹果,一开始每个节点都有1个苹果 有两种操作,C表示更改某个节点的苹果数,0变1,1变 ...

  7. poj 3321 Apple Trie

    /*poj 3321 Apple Trie这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题!可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目所以我 ...

  8. DFS序——树链剖分前驱知识

    目录 定义:dfs序:每个节点在dfs深度优先遍历中的进出栈的时间序列. 性质:dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间. 对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中 ...

  9. HDU - 5788 Level Up(主席树+dfs序+树状数组)

    题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...

最新文章

  1. eclipse连接小米2调试程序的问题
  2. SolrJ添加商品数据
  3. Dos 中实现else if 功能
  4. php根据汉字首字母分组,利用PHP获取汉字首字母并且分组排序详解
  5. 人工智能ai 学习_人工智能中强化学习的要点
  6. 【CSS】CSS 的优先级总结
  7. Python存储和读取数据
  8. c语言程序设计身高体重测评系统,C语言程序设计验.doc
  9. Docker安装Redis 6.2.6的3主3从集群和集群的扩缩容操作
  10. CMOS、TTL门电路基础
  11. 【VB】中CInt()、Fix()、Int()的区别
  12. 成为成功的软件开发顾问的5个关键
  13. JavaScript实现在线进制转换工具网站 -toolfk程序员工具网
  14. 某型发动机整机测试研究
  15. 备份你的Sina博客
  16. 随笔-OC获取系统时间,获取绝对时间,获得真实时间
  17. leetcode 39. 组合总和
  18. Android_常驻进程(杀不死的进程)
  19. 电装实验报告计算机联网,电装实验报告
  20. numpy.choose函数

热门文章

  1. 代码结构设计得最好的多链支持的 HD 钱包服务端代码
  2. 走得最慢的人,只要他不丧失目标,也比漫无目的地徘徊的人走得快。
  3. 中兴捧月神算师-算法精英挑战赛-比特派第一场
  4. 项目Cycle Time的一种确定方式
  5. VC6.0中ObjectARX应用程序的加载与运行
  6. OpenCv 练习题 霍夫(Hough)变换
  7. 【年总】----折戟沉沙心不倦,大风起兮云飞扬!
  8. 百度地图在IOS中不显示
  9. WinAPI: GetTempPath - 获取临时文件夹路径
  10. openshift java_在OpenShift上部署Java应用程序的快速指南