poj 3321 Apple Tree
2016-01-22 17:15
447 查看
题意:一颗苹果树,树上有n个树枝节点,一个节点有一个苹果,有n-1个树枝。模型是即n个点n-1条边的树,叉数不定。对这棵树可进行两种操作,其中Q x是询问第x节点上子树的苹果个数,C x是如果x节点上有苹果,就会被拿掉,如果没有,树就会长出苹果。
思路:本题关键就在于建立树和树状数组的映射关系。对于每一个树枝节点,我们需要知道的就是它的管辖范围,即它下面包括自己一共管了多少个节点,并且指定到具体区间,那么首先就需要DFS遍历这个树,在DFS内使用一个累加器记录遍历节点的个数,在递推到某个节点的时候累加器的值就是这个节点所管辖范围的起始值即下限,当又一次回溯回这个节点的时候累加器的值就是这个节点所管辖范围的上限。这个节点的下限就是这个节点在树状数组中的位置,计算query(high)- query(low-1)可得到该节点所有苹果个数。
下面这个图有助于理解:
思路:本题关键就在于建立树和树状数组的映射关系。对于每一个树枝节点,我们需要知道的就是它的管辖范围,即它下面包括自己一共管了多少个节点,并且指定到具体区间,那么首先就需要DFS遍历这个树,在DFS内使用一个累加器记录遍历节点的个数,在递推到某个节点的时候累加器的值就是这个节点所管辖范围的起始值即下限,当又一次回溯回这个节点的时候累加器的值就是这个节点所管辖范围的上限。这个节点的下限就是这个节点在树状数组中的位置,计算query(high)- query(low-1)可得到该节点所有苹果个数。
下面这个图有助于理解:
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; struct node { int v,next; }d[1000000]; struct NODE { int low,high; }p[100010]; int head[100010]; int vis[100010]; int atree[100010],a[100010]; int step,n; void DFS(int u) { vis[u]=1; step++; p[u].low=step; for(int i=head[u];i!=-1;i=d[i].next) { if(!vis[d[i].v]) { DFS(d[i].v); } } p[u].high=step; } void add(int t,int d) { while(t<=n) { atree[t] += d; t+=t&-t; } } int query(int t) { int sum=0; while(t>0) { sum += atree[t]; t-=t&-t; } return sum; } int main() { int m,x; int cnt=0; int u,v; char c[2]; step=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(atree,0,sizeof(atree)); scanf("%d",&n); for(int i=0;i<n-1;i++) { scanf("%d%d",&u,&v); d[cnt].next=head[u]; d[cnt].v=v; head[u]=cnt++; d[cnt].next=head[v]; d[cnt].v=u; head[v]=cnt++; } DFS(1); for(int i=1;i<=n;i++) { add(i,1); a[i]=1; } scanf("%d%*c",&m); while(m--) { scanf("%s",c); if(c[0]=='C') { scanf("%d%*c",&x); if(a[p[x].low]==1){ add(p[x].low,-1); a[p[x].low]=0; } else { add(p[x].low,1); a[p[x].low]=1; } } else { scanf("%d%*c",&x); int ans=query(p[x].high)-query(p[x].low-1); printf("%d\n",ans); } } return 0; }
相关文章推荐
- [Android4.4]NetworkManagementService与Netd交互流程
- 【推荐】微信运营书一箩筐,微信运营手册、微信力量
- 一位腾讯产品的微信公众号运营手册
- 01Android_Studio过滤文件提交至Git
- 怎样使用 App Studio 高速定制你自己的 Universal Windows App
- Android 数字签名详解
- unable to access android sdk add-on list
- spring加载jar包中的application.xml文件
- Android Design Support Library 介绍
- iOS自定义的emoji表情键盘
- 目录相关 Android APP
- Ionic在Android上部署app步骤
- [AndroidAnnotatians] Intent传参
- Android HandlerThread 完全解析
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】
- swift学习笔记(一)(常量、变量、数据类型、字符串的拼接、数组、字典)
- [iOS]开发者证书和描述文件的作用
- android 新特性material design 之recyclerview 详解
- Android 关闭多个Activity总结
- android 汉字,拼音和英文返回大写首字母