codevs——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
拿到这个题目以后,我们第一眼看到的会是:有m次询问,每次询问2种操作。那么就可以很快的get到这个题是要用线段树。
但是问题又来了,现在他给我们的是一个树啊,而且我们线段树维护的是一个序列,那我们就要先办法将这棵树转化成一个序列
我们想一下要用什么方法完成这个操作呢?? 对!就是dfs序!
我们现对于我们建出来的树跑一遍dfs,然后求出每一个节点的dfs序,同时处理出每一个节点的子树的大小,这样我们可以保证每一棵子树内的所有的节点都是相连的。以一个节点为子树的区间即为从这个节点到这个节点+其子树的大小+1,当我们询问一个节点的苹果个数是既可以转换成询问这个区间的大小。在我们进行苹果的更改时,即为对一个点进行单点修改,我们进行单点修改的时候我们直接对其进行取反既可以。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 110000 using namespace std; char ch; int n,m,q,x,y,s,tot,ans; int head[N],size[N],list1[N],list2[N]; int read() { ,f=; char ch=getchar(); ; ch=getchar();} +ch-'; ch=getchar();} return x*f; } struct Edge { int next,to,from; }edge[N<<]; int add(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=head[x]; head[x]=tot; } struct Tree { int l,r,w; }tree[N*]; int dfs(int x) { size[x]=,list1[x]=++s,list2[s]=x; for(int i=head[x];i;i=edge[i].next) { int t=edge[i].to; dfs(t); size[x]+=size[t]; } } void build(int k,int l,int r) { tree[k].l=l,tree[k].r=r; if(tree[k].l==tree[k].r) { tree[k].w=; return ; } ; build(k<<,l,mid); build(k<<|,mid+,r); tree[k].w=tree[k<<].w+tree[k<<|].w; } void change_point(int k) { if(tree[k].l==tree[k].r) { tree[k].w=!tree[k].w; return ; } ; ); |); tree[k].w=tree[k<<].w+tree[k<<|].w; } void ask_interval(int k) { if(tree[k].l>=x&&tree[k].r<=y) { ans+=tree[k].w; return ; } ; ); |); } int main() { n=read(); ;i<n;i++) x=read(),y=read(),add(x,y); dfs(); build(,,n); m=read(); while(m--) { cin>>ch; q=read(); x=list1[q];ans=; ); else { y=x+size[q]-;ask_interval(); printf("%d\n",ans); } } ; }
codevs——1228 苹果树的更多相关文章
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- CODEVS.1228 苹果树(DFS序)
To CODEVS.1228 苹果树 To poj 3321 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结出很多的苹果.卡卡非常喜欢吃苹果,所以他一直都精心的呵护这 ...
- codevs 1228 苹果树
dfs序+线段树 #include<iostream> #include<cstdio> #include<cstring> #include<algorit ...
- AC日记——苹果树 codevs 1228
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在卡卡的房子外面,有一棵 ...
- 苹果树(codevs 1228)
题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结出很多的苹果.卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树.我们知道树是有很多分叉点的,苹果会长在枝条的 ...
- 苹果树(线段树+Dfs序)
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总 ...
- codevs1228 (dfs序+线段树)
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
随机推荐
- visual c++ build tools的安装与使用
https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&r ...
- bootstrap table 保留翻页选中数据
$(function () { $('#exampleTable').on('uncheck.bs.table check.bs.table check-all.bs.table uncheck-al ...
- Bootstrap 翻页(pager)
如果您想要创建一个简单的分页链接为用户提供导航,可以通过翻页来实现.与分布链接一样,也是一个无序列表.默认情况下,翻页是居中显示的.下面列出了bootstrap处理翻页的类. Class 描述 示例代 ...
- 在Xcode中编辑运行 Python 脚本
http://www.zhihu.com/question/19872198 打开Xcode,File->New->Project选中OS X下的Other点击External Build ...
- laravel中对加载进行优化
在laravel中的模型与模型之间创建好关联关系会比较方便的方法 但是我们为了方便,有时也会忽略一些东西,比如: 我们在控制器中把整个一个文章对象传到了模板页面 在一次for循环下, 我们对数据进行了 ...
- 【cpu】CPU版本认识
此图应该是摘选自<鸟哥的linux私房菜>
- Python字符串操作详解
菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...
- 循环链表的C风格实现(单向)
头文件: #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_ typedef void CircleList; // typedef struct _tag_C ...
- Eclipse如何创建模拟器
Eclipse如何创建模拟器下载地址:http://developer.android.com/sdk/index.html#downloadJDK安装包: 1, 打开安卓模拟器控制台(windows ...
- 面试准备——JVM相关
https://www.cnblogs.com/goody9807/p/6511480.html https://www.cnblogs.com/java1024/p/8594784.html htt ...