POJ_3321_APPLE_TREE
poj上面的一道求子树上苹果的题目,网上看了很多题解,下面我来回忆一下,基本来源于大神的微博,http://blog.csdn.net/zhang20072844,我来做个搬运工。
先将树的n条边上节点重新标号,让每一棵子树上的节点编号构成一个连续的区间,然后利用dfs将第i个节点表示的区间下限,上限存进数组low[u],high[u]。树状数组c[i]=a[i-2^k+1]+a[i-2^k+2]+.....a[i],也就是i-2^k+1到i之间的苹果总数,每一个a[i]表示树上一个分叉,i是经过重新标号后的表示节点的值。
可以通过add(low[i],1)为第i(原苹果树中标号)个节点增加一个苹果,同时更新树状数组中和i(也就是元素a[low[i]]有关的c[j]值,这样查询low[i]到high[i]区间范围内的苹果数目便可以通过sum(high[i])-sum(low[i]-1),其中sum(t)表示a[i]+a[2].....a[t]之和也就是这些节点上苹果数目。
#include<stdio.h>
#include<string.h>
#define N 100010 typedef struct
{
int to,next;
} Edge;
Edge edge[N];
int low[N],high[N],vis[N],c[N*],head[N],pick[N];
int dep,p,n; void addedge(int cu,int cv)
{
edge[p].to=cv;
edge[p].next=head[cu];
head[cu]=p++;
} void dfs(int u)
{
low[u]=++dep;
vis[u]=;
int i;
for(i=head[u]; i!=-; i=edge[i].next)
{
if(!vis[edge[i].to])
dfs(edge[i].to);
}
high[u]=dep;
} int lowbit(int x)
{
return x&(-x);
}
void add(int t,int v)
{
while(t<=n)
{
c[t]+=v;
t+=lowbit(t);
}
} int sum(int t)
{
int res=;
while(t>)
{
res+=c[t];
t-=lowbit(t);
}
return res;
} int main(void)
{
int m,i,u,v;
memset(head,-,sizeof(head));
scanf("%d",&n);
for(i=; i<n; i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
dfs();
for(i=; i<=n; i++)
{
add(i,);
pick[i]=;
}
scanf("%d",&m);
while(m--)
{
getchar();
char op;
scanf("%c%d",&op,&i);
if(op=='Q')
printf("%d\n",sum(high[i])-sum(low[i]-));
else
{
if(pick[i])
{
add(low[i],-);
pick[i]=;
}
else
{
add(low[i],);
pick[i]=;
}
}
}
return ;
}
POJ_3321_APPLE_TREE的更多相关文章
随机推荐
- 淘宝开源Web服务器Tengine安装教程
简介Tengine是由淘宝核心系统部基于Nginx开发的Web服务器,它在Nginx的基础上,针对大访问量网站的需求,添加了很多功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,淘宝商 ...
- 关于MDCSwipeToChooseView的应用
本人因为项目中某个页面的功能需要,用到了MDCSwipeToChooseView,就在网上查阅了相关的资料,资源有很多,但应该都是同一个人上传的,code4还有git上都有,但下载demo下来后运行不 ...
- Objective-C 成员变量的访问修饰即成员变量可见性解析
总体来说Objective-C的访问成员变量可见性和C++基本一样,只是多了个@package. 以下是详细说明: 例子: @interface CTPerson : NSObject { @priv ...
- Glibc和GCC,ARM-LINUX-GCC的关系
看到有些贴子/blog上提到「Glibc编译器」,这是个错误的用语.Glibc不是编译器,Glibc不是编译器,Glibc不是编译器.重要的事情说三遍.GCC才是编译器.
- Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...
- bzoj1007:[HNOI2008]水平可见直线
思路:首先按斜率排序,如果斜率相同就取截距最大的,显然截距小的会被覆盖而对答案没有贡献,然后考虑斜率不同的如何统计答案,可以用一个单调栈维护,当前新插入的直线显然斜率是要比当前栈顶斜率要大的,然后如果 ...
- (转)所有iOS设备的屏幕分辨率
Phone: iPhone 1G 320x480 iPhone 3G 320x480 iPhone 3GS 320x480 iPhone 640x960 iPhone 4S 640x960 iPhon ...
- HeadFirst设计模式
oo基础 抽象 封装 多态 继承 oo原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程(策略模式) 为交互对象之间的松耦合设计而努力(观察者模式) 对扩展开放,对修改关闭(装饰者模式) ...
- 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed
这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...
- 曾经的10道JAVA面试题
1.HashMap和Hashtable的区别. 都属于Map接口的类,实现了将惟一键映射到特定的值上.HashMap 类没有分类或者排序.它允许一个null 键和多个null 值.Hashtable ...