苹果树(线段树+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 100010using 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*2];struct node {int l,r,dis,flag; }tre[maxn*4];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=1;return;}int mid=(l+r)>>1;build(now<<1,l,mid);build(now<<1|1,mid+1,r);tre[now].dis=tre[now<<1].dis+tre[now<<1|1].dis; }void Dfs(int z) {time1[z]=++tot;vis[z]=1;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=1;else tre[now].dis=0;return;}int mid=(l+r)>>1;if(k>mid) f_change(now<<1|1,k);if(k<=mid) f_change(now<<1,k);tre[now].dis=tre[now<<1].dis+tre[now<<1|1].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<<1].dis+tre[now<<1|1].dis;int mid=(tre[now].l+tre[now].r)>>1;if(r<=mid)return Query(now<<1,l,r);else if(l>mid)return Query(now<<1|1,l,r);else{return Query(now<<1,l,mid)+Query(now<<1|1,mid+1,r);} }int main() {scanf("%d",&n);build(1,1,n);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}Dfs(1);scanf("%d",&m);for(int i=1;i<=m;i++){cin>>c>>z;if(c=='Q') printf("%d\n",Query(1,time1[z],time2[z]));if(c=='C') f_change(1,time1[z]);}return 0; }
心若向阳,无言悲伤
转载于:https://www.cnblogs.com/L-Memory/p/6298280.html
苹果树(线段树+Dfs序)相关推荐
- bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- HDU5692(线段树+dfs序)
Snacks Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)
题目链接:点击查看 题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作: 1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色 题目分析:看完这个题的第一反 ...
- bzoj3252攻略(线段树+dfs序)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 562 Solved: 238 [Submit][Status][Discuss] ...
- HDU - 3974 Assign the task (线段树 + dfs序)
HDU - 3974 题意:有个公司有一些关系,每个人(除了boss)都有且仅有一个上司,这就是一棵树的关系,然后会有一些操作,C i,询问第i个人现在的任务,T x y,把y任务给x, 给x相当于给 ...
- Change FZU - 2277(线段树+dfs序)
There is a rooted tree with n nodes, number from 1-n. Root's number is 1.Each node has a value ai. I ...
- Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)
题目地址 题意:给你一棵树,1为根节点,每个节点都有应该状态0或者1,你有两种操作,pow的操作是把该节点以及他的所有子树的每个节点进行自身异或的操作,get就是查询该节点以及他的所有子树的每个节点有 ...
- BZOJ 3779 LCT 线段树 DFS序 坑
hhhh抄了半天lty代码最后T了 对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...
最新文章
- 2022年人工智能全球最具影响力学者榜单AI 2000
- 谈谈中小创业型网站防DDOS及CC,我的草根站长经历。
- Apache-Guacamole windows11 远程控制
- JEPaas功能_isEmpty(b.getValue())?“doSave“:“doUpdate“;
- linux 定位 踩内存_互联网线上系统故障定位方法论
- Windows 7 通过无线网卡,模拟Wifi,实现手机,电脑等无线设备共享上网
- 30.yii2 --- 全文检索简介
- 【python】拉格朗日插值法 和 牛顿插值法
- Excel表格转latex以及转换后的表格边框截断解决、加粗和内容水平垂直居中
- MFC API 设置Excel单元格格式
- KETTLE的文本文件输出
- python字典生成器_Python字典生成式、集合生成式、生成器用法实例分析
- js控制表格实时编辑
- 2020-12-18
- 中国气象网 气象数据开放平台 API使用方法 (Android)(已废弃)
- java针刺治疗尿潴留,针刺治疗尿潴留52例疗效观察
- 布局 flex让元素一个靠左一个靠右
- 彻底解决 Windows 下 PHP 响应异常缓慢的问题
- cct计算机考试介绍(全)
- 众昂矿业:萤石资源列入战略性矿产目录