1228 苹果树

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
题目描述 Description

在卡卡的房子外面,有一棵苹果树。每年的春天,树上总会结出很多的苹果。卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树。我们知道树是有很多分叉点的,苹果会长在枝条的分叉点上面,且不会有两个苹果结在一起。卡卡很想知道一个分叉点所代表的子树上所结的苹果的数目,以便研究苹果树哪些枝条的结果能力比较强。

卡卡所知道的是,每隔一些时间,某些分叉点上会结出一些苹果,但是卡卡所不知道的是,总会有一些调皮的小孩来树上摘走一些苹果。

于是我们定义两种操作:

C x

表示编号为x的分叉点的状态被改变(原来有苹果的话,就被摘掉,原来没有的话,就结出一个苹果)

G x

查询编号为x的分叉点所代表的子树中有多少个苹果

我们假定一开始的时候,树上全都是苹果,也包括作为根结点的分叉1。

输入描述 Input Description

第一行一个数N (n<=100000)

接下来n-1行,每行2个数u,v,表示分叉点u和分叉点v是直接相连的。

再接下来一行一个数M,(M<=100000)表示询问数

接下来M行,表示询问,询问的格式如题目所述Q x或者C x

输出描述 Output Description

对于每个Q x的询问,请输出相应的结果,每行输出一个

样例输入 Sample Input

3

1 2

1 3

3

Q 1

C 2

Q 1

样例输出 Sample Output

3

2

  1. /*
  2. 这个题是一棵树
  3. 他的点的编号顺序并不是按照线段树的节点顺序来排列的
  4. 所以我们要想方设法把这个节点融入线段树中
  5. 如何融入线段树呢?
  6. 首先把这些点和边都存起来
  7. 然后我们考虑把节点存成一个线性的区间
  8. 所以是Dfs许 维护遍历到的时间和结束的时间,形成一个区间。
  9. 然后每个节点就是就是它的区间的第一个值
  10. 线段树完成单点修改和区间查询
  11. */
  12. #include<iostream>
  13. #include<cstdio>
  14. #include<cstring>
  15. #define maxn 100010
  16.  
  17. using namespace std;
  18. int n,m,x,y,z,cnt,tot,time1[maxn],time2[maxn];
  19. int head[maxn],vis[maxn];
  20. char c;
  21.  
  22. struct node0
  23. {
  24. int from,to,dis,next;
  25. }e[maxn*];
  26.  
  27. struct node
  28. {
  29. int l,r,dis,flag;
  30. }tre[maxn*];
  31.  
  32. void add(int from,int to)
  33. {
  34. e[++cnt].from=from;
  35. e[cnt].to=to;
  36. e[cnt].next=head[from];
  37. head[from]=cnt;
  38. }
  39.  
  40. void build(int now,int l,int r)
  41. {
  42. tre[now].l=l;tre[now].r=r;
  43. if(l==r)
  44. {
  45. tre[now].dis=;
  46. return;
  47. }
  48. int mid=(l+r)>>;
  49. build(now<<,l,mid);
  50. build(now<<|,mid+,r);
  51. tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
  52. }
  53.  
  54. void Dfs(int z)
  55. {
  56. time1[z]=++tot;
  57. vis[z]=;
  58. for(int i=head[z];i;i=e[i].next)
  59. {
  60. int v=e[i].to;
  61. if(!vis[v])
  62. Dfs(v);
  63. }
  64. time2[z]=tot;
  65. }
  66.  
  67. void f_change(int now,int k)
  68. {
  69. int l=tre[now].l,r=tre[now].r;
  70. if(l==r)
  71. {
  72. if(!tre[now].dis) tre[now].dis=;
  73. else tre[now].dis=;
  74. return;
  75. }
  76. int mid=(l+r)>>;
  77. if(k>mid) f_change(now<<|,k);
  78. if(k<=mid) f_change(now<<,k);
  79. tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
  80. }
  81.  
  82. int Query(int now,int l,int r)
  83. {
  84. if(tre[now].l==l&&tre[now].r==r)
  85. {
  86. return tre[now].dis;
  87. }
  88. tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
  89. int mid=(tre[now].l+tre[now].r)>>;
  90. if(r<=mid)return Query(now<<,l,r);
  91. else if(l>mid)return Query(now<<|,l,r);
  92. else
  93. {
  94. return Query(now<<,l,mid)+Query(now<<|,mid+,r);
  95. }
  96. }
  97.  
  98. int main()
  99. {
  100. scanf("%d",&n);
  101. build(,,n);
  102. for(int i=;i<n;i++)
  103. {
  104. scanf("%d%d",&x,&y);
  105. add(x,y);add(y,x);
  106. }
  107. Dfs();
  108. scanf("%d",&m);
  109. for(int i=;i<=m;i++)
  110. {
  111. cin>>c>>z;
  112. if(c=='Q') printf("%d\n",Query(,time1[z],time2[z]));
  113. if(c=='C') f_change(,time1[z]);
  114. }
  115. return ;
  116. }

心若向阳,无言悲伤

苹果树(线段树+Dfs序)的更多相关文章

  1. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  2. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  5. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  6. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. POJ3321[苹果树] 树状数组/线段树 + dfs序

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:39452   Accepted: 11694 Descr ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3306】树 线段树 + DFS序

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 792  Solved: 262[Submit][Status][Discuss] De ...

随机推荐

  1. NOIP 2018 真・退役记

    目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...

  2. Python学习-字符串函数操作2

    字符串函数操作 find( sub, start=None, end=None):从左到右开始查找目标子序列,找到了结束查找返回下标值,没找到返回 -1 sub:需要查找的字符串 start=None ...

  3. vue-cli 3.x 配置多环境

    思路:新建一个 process.env 变量. 把 webpack 配置放到 vue.config.js 里面. 如果根目录下没有该文件,新建.配置参考:https://cli.vuejs.org/z ...

  4. Mysql Group by 分组取最小的实现方法

    表结构如下图:

  5. 一:安装centos 7最小编程环境 xfce桌面

    1, u盘制作安装盘------------------------------------------------------安装时, table或者e进入编辑选项    如果不知道你的u盘的盘符 ...

  6. Linux学习总结(18)——Linux使用init命令关机、重启、切换模式

    reboot可能是每个用过Linux的人都知道的命令,但有一个命令"init"才是命令中的精英. 最近有个同事学习安装了CentOS,明明安装的是带桌面的系统,但是启动后进入了命令 ...

  7. 最接近的点配对(分治问题理解) && HDU 1007代码

    题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...

  8. poj3352

    Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7980 Accepted: 4014 Des ...

  9. [fw]Best Practices for Exception Handling

    http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html http://www.onjava.com/pub/a/onjava/200 ...

  10. Java配置方式读取外部的资源配置文件

    通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: package cn.qlq; import org.springframework.context. ...