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

思路:

  首先这个题是一棵树

  他的点的编号顺序并不是按照线段树的节点顺序来排列的

  所以我们要想方设法把这个节点融入线段树中

  如何融入线段树呢?

  首先把这些点和边都存起来

  然后我们考虑把节点存成一个线性的区间

  定义一个cnt来记录当前的节点的编号和它所连的点(不包括他被延伸的节点)的

  然后从第一个节点开始遍历

  用dfs序来延伸,并把新点不断存入区间

  然后所有的节点所能延伸的点包括自己都能被表示为一个区间

  然后每个节点就是就是它的区间的第一个值

  然后线段树完成单点修改和区间查询

  轻松水过

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; struct T_tree {
int l,r,dis;
};
struct T_tree tree[]; struct T_edge {
int from,to,next;
};
struct T_edge edge[]; struct T_interval {
int li,ri;
};
struct T_interval find_[]; int n,m,num_edge=,head[],tot=; inline void edge_add(int from,int to)
{
num_edge++;
edge[num_edge].to=to;
edge[num_edge].from=from;
edge[num_edge].next=head[from];
head[from]=num_edge;
} void dfs(int now)
{
tot++;
find_[now].li=tot;
for(int i=head[now];i;i=edge[i].next)
{
dfs(edge[i].to);
}
find_[now].ri=tot;
} void tree_up(int now)
{
tree[now].dis=tree[now<<].dis+tree[now<<|].dis;
} void tree_build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].dis=;
return ;
}
int mid=(l+r)>>;
tree_build(now<<,l,mid);
tree_build(now<<|,mid+,r);
tree_up(now);
return ;
} void tree_change(int now,int to)
{
if(to==tree[now].l&&tree[now].r==to)
{
if(tree[now].dis) tree[now].dis=;
else tree[now].dis=;
return ;
}
int mid=(tree[now].l+tree[now].r)>>;
if(to>mid) tree_change(now<<|,to);
else tree_change(now<<,to);
tree_up(now);
} int tree_query(int now,int l,int r)
{
if(tree[now].l==l&&tree[now].r==r)
{
return tree[now].dis;
}
int mid=(tree[now].l+tree[now].r)>>;
if(l>mid) return tree_query(now<<|,l,r);
else if(r<=mid) return tree_query(now<<,l,r);
else return tree_query(now<<,l,mid)+tree_query(now<<|,mid+,r);
} int main()
{
scanf("%d",&n);
int from,to;
for(int i=;i<n;i++)
{
scanf("%d%d",&from,&to);
edge_add(from,to);
}
dfs();
tree_build(,,n);
scanf("%d",&m);
char t_do;
int to_ch;
for(int i=;i<=m;i++)
{
//scanf("%c %d",&t_do,&to_ch);
//scanf("%c",&t_do);
//scanf("%d",&to_ch);
cin>>t_do>>to_ch;
if(t_do=='Q') printf("%d\n",tree_query(,find_[to_ch].li,find_[to_ch].ri));
else tree_change(,find_[to_ch].li);
}
return ;
}

AC日记——苹果树 codevs 1228的更多相关文章

  1. AC日记——楼房 codevs 2995

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 地平线(x轴)上有n个矩(lou ...

  2. AC日记——传话 codevs 1506 (tarjan求环)

    1506 传话  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 一个朋友网络,如果a认识b,那么如果a第 ...

  3. AC日记——绿色通道 codevs 3342

    3342 绿色通道  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description <思远高考绿色通道&g ...

  4. AC日记——蓬莱山辉夜 codevs 2830

    2830 蓬莱山辉夜  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在幻想乡中,蓬莱山辉夜是月球 ...

  5. AC日记——刺激 codevs 1958

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold     题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激 ...

  6. AC日记——红与黑 codevs 2806

    2806 红与黑  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Description 有一个矩形房间,覆盖正方形瓷 ...

  7. AC日记——热浪 codevs 1557 (最短路模板题)

    1557 热浪  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...

  8. AC日记——字典 codevs 4189

    4189 字典  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 最经,skyzhong得到了 ...

  9. AC日记——开关灯 codevs 1690

    开关灯 思路: 线段树: bool懒标记维护: 更新区间时是区间总值减去当前值: 来,上代码: #include <cstdio> #include <cstring> #in ...

随机推荐

  1. 2分钟在eclipse下使用SpringBoot搭建Spring MVC的WEB项目

    1. 首先用eclipse创建一个maven工程, 普通maven工程即可 2. 修改pom如下: <?xml version="1.0" encoding="UT ...

  2. 【工匠大道】Git的使用总结

    初衷是想将一些常用的代码整理在博客园上,但是考虑到博客园上的代码量多,需要折叠,折叠后就不能直接修改,于是想到了 大家都常用的 gitHub来进行代码的管理. 其实之前我是用过 Osa的git的,但是 ...

  3. Linux(一)__入门介绍

    linux的特点 优点: 1.免费的/开源的系统 2.支持多线程/多用户的系统 3.安全性好 4.对内存和文件管理优越 5.提供了丰富的网络功能 6.良好的用户界面.图形化界面和字符型界面 linux ...

  4. 【单页应用】理解MVC

    前言 之前我们为view引入了wrapperSet的概念,想以此解决view局部刷新问题,后来发现这个方案不太合理 view里面插入了业务相关的代码,事实上这个是应该剥离出去,业务的需求千奇百怪,我们 ...

  5. iOS下Audio自动播放(Autoplay)音乐

    前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...

  6. npm 入门

    要使用 npm 需要安装 node.js,因为 node.js 中会附带 npm 查看 node 的安装路径 which node 查看 npm 的安装路径 which npm npm 分为两种安装模 ...

  7. 使用ssh连接gitHub

    github每次pull/push代码时要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码用以验证用户是否为合法用户,而ssh是一种安全的传输模式,可以代替用户的这一"输入账号密码 ...

  8. 西南大学校园GIS平台

    系统架构是B/S,开发语言是C#.silverlight,开发平台是.NET,数据库为sqlserver,这是我读研究生时候自己做的作品,以自己的母校为地图,进行GIS相关的功能分析,核心的模块有:空 ...

  9. SharePoint 2013 扩展查阅项功能

    SharePoint 2013的查阅项功能,就是可以扩展其他列表字段为当前列表选项,但是选项太多的时候,会造成选择起来非常麻烦,所以,我们采取JS+Ajax的方式,改善一下这个展示,使操作更加方便. ...

  10. IOS RunLoop浅析 二

    上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢??? 模式中有三个模块: 事件源(输入源) Source Source: 按照官方文档分类 Port-Based Custom ...