苹果树(线段树+Dfs序)
1228 苹果树
在卡卡的房子外面,有一棵苹果树。每年的春天,树上总会结出很多的苹果。卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树。我们知道树是有很多分叉点的,苹果会长在枝条的分叉点上面,且不会有两个苹果结在一起。卡卡很想知道一个分叉点所代表的子树上所结的苹果的数目,以便研究苹果树哪些枝条的结果能力比较强。
卡卡所知道的是,每隔一些时间,某些分叉点上会结出一些苹果,但是卡卡所不知道的是,总会有一些调皮的小孩来树上摘走一些苹果。
于是我们定义两种操作:
C x |
表示编号为x的分叉点的状态被改变(原来有苹果的话,就被摘掉,原来没有的话,就结出一个苹果) |
G x |
查询编号为x的分叉点所代表的子树中有多少个苹果 |
我们假定一开始的时候,树上全都是苹果,也包括作为根结点的分叉1。
第一行一个数N (n<=100000)
接下来n-1行,每行2个数u,v,表示分叉点u和分叉点v是直接相连的。
再接下来一行一个数M,(M<=100000)表示询问数
接下来M行,表示询问,询问的格式如题目所述Q x或者C x
对于每个Q x的询问,请输出相应的结果,每行输出一个
3
1 2
1 3
3
Q 1
C 2
Q 1
3
2
- /*
- 这个题是一棵树
- 他的点的编号顺序并不是按照线段树的节点顺序来排列的
- 所以我们要想方设法把这个节点融入线段树中
- 如何融入线段树呢?
- 首先把这些点和边都存起来
- 然后我们考虑把节点存成一个线性的区间
- 所以是Dfs许 维护遍历到的时间和结束的时间,形成一个区间。
- 然后每个节点就是就是它的区间的第一个值
- 线段树完成单点修改和区间查询
- */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define maxn 100010
- using namespace std;
- int n,m,x,y,z,cnt,tot,time1[maxn],time2[maxn];
- int head[maxn],vis[maxn];
- char c;
- struct node0
- {
- int from,to,dis,next;
- }e[maxn*];
- struct node
- {
- int l,r,dis,flag;
- }tre[maxn*];
- void add(int from,int to)
- {
- e[++cnt].from=from;
- e[cnt].to=to;
- e[cnt].next=head[from];
- head[from]=cnt;
- }
- void build(int now,int l,int r)
- {
- tre[now].l=l;tre[now].r=r;
- if(l==r)
- {
- tre[now].dis=;
- return;
- }
- int mid=(l+r)>>;
- build(now<<,l,mid);
- build(now<<|,mid+,r);
- tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
- }
- void Dfs(int z)
- {
- time1[z]=++tot;
- vis[z]=;
- for(int i=head[z];i;i=e[i].next)
- {
- int v=e[i].to;
- if(!vis[v])
- Dfs(v);
- }
- time2[z]=tot;
- }
- void f_change(int now,int k)
- {
- int l=tre[now].l,r=tre[now].r;
- if(l==r)
- {
- if(!tre[now].dis) tre[now].dis=;
- else tre[now].dis=;
- return;
- }
- int mid=(l+r)>>;
- if(k>mid) f_change(now<<|,k);
- if(k<=mid) f_change(now<<,k);
- tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
- }
- int Query(int now,int l,int r)
- {
- if(tre[now].l==l&&tre[now].r==r)
- {
- return tre[now].dis;
- }
- tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
- int mid=(tre[now].l+tre[now].r)>>;
- if(r<=mid)return Query(now<<,l,r);
- else if(l>mid)return Query(now<<|,l,r);
- else
- {
- return Query(now<<,l,mid)+Query(now<<|,mid+,r);
- }
- }
- int main()
- {
- scanf("%d",&n);
- build(,,n);
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- add(x,y);add(y,x);
- }
- Dfs();
- scanf("%d",&m);
- for(int i=;i<=m;i++)
- {
- cin>>c>>z;
- if(c=='Q') printf("%d\n",Query(,time1[z],time2[z]));
- if(c=='C') f_change(,time1[z]);
- }
- return ;
- }
心若向阳,无言悲伤
苹果树(线段树+Dfs序)的更多相关文章
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- POJ3321[苹果树] 树状数组/线段树 + dfs序
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions:39452 Accepted: 11694 Descr ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3306】树 线段树 + DFS序
3306: 树 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 792 Solved: 262[Submit][Status][Discuss] De ...
随机推荐
- 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. ...
- Python学习-字符串函数操作2
字符串函数操作 find( sub, start=None, end=None):从左到右开始查找目标子序列,找到了结束查找返回下标值,没找到返回 -1 sub:需要查找的字符串 start=None ...
- vue-cli 3.x 配置多环境
思路:新建一个 process.env 变量. 把 webpack 配置放到 vue.config.js 里面. 如果根目录下没有该文件,新建.配置参考:https://cli.vuejs.org/z ...
- Mysql Group by 分组取最小的实现方法
表结构如下图:
- 一:安装centos 7最小编程环境 xfce桌面
1, u盘制作安装盘------------------------------------------------------安装时, table或者e进入编辑选项 如果不知道你的u盘的盘符 ...
- Linux学习总结(18)——Linux使用init命令关机、重启、切换模式
reboot可能是每个用过Linux的人都知道的命令,但有一个命令"init"才是命令中的精英. 最近有个同事学习安装了CentOS,明明安装的是带桌面的系统,但是启动后进入了命令 ...
- 最接近的点配对(分治问题理解) && HDU 1007代码
题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...
- poj3352
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7980 Accepted: 4014 Des ...
- [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 ...
- Java配置方式读取外部的资源配置文件
通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: package cn.qlq; import org.springframework.context. ...