苹果树(线段树+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 ...
随机推荐
- 在vue中使用echars不能自适应的解决方法
<div class="echarts"> <IEcharts :option="bar" ref="echarts"&g ...
- 洛谷 3833 SHOI 2012 魔法树
[题解] 树链剖分模板题.. #include<cstdio> #include<algorithm> #include<queue> #define N 5000 ...
- [luoguP1005] 矩阵取数游戏(DP + 高精度)
传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...
- CTF常用在线工具总结
在线工具 MD5加密 MD5解密(推荐) MD5解密(推荐) MD5解密 escap加解密 维吉尼亚密码 SHA 对称加密AES DES\3DES RC4\Rabbit Quoted-print ...
- 模拟赛 Problem 2 不等数列(num.cpp/c/pas)
Problem 2 不等数列(num.cpp/c/pas) [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有 ...
- Ubuntu查看系统版本的方法
1. less /etc/issue 2. less /proc/version 3. uname -a 4. lsb_release -a
- 在全程Linux環境部署IBM Lotus Domino/Notes 8.5
架設藍色巨人的協同合作訊息平台 在全程Linux環境部署IBM Lotus Domino/Notes 8.5 珊迪小姐 坊間幾乎所有探討IBM Domino/Notes的中文書籍,皆是以部署在Micr ...
- Python3基础(十一) 类的拓展
在类的初印象中,我们已经简单的介绍了类,包括类的定义.类对象和实例对象.本文将进一步学习类的继承.迭代器.发生器等等. 一.类的继承 单继承 派生类的定义如下: class DerivedClassN ...
- Android BroadcastAnyWhere(Google Bug 17356824)漏洞具体分析
Android BroadcastAnyWhere(Google Bug 17356824)漏洞具体分析 作者:简行(又名 低端码农) 继上次Android的LaunchAnyWhere组件安全漏洞后 ...
- MySQL create table as与create table like对照
在MySQL数据库中,关于表的克隆有多种方式,比方我们能够使用create table ..as .. .也能够使用create table .. like ..方式. 然而这2种不同的方 ...