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的更多相关文章

随机推荐

  1. Java并发——ReentrantLock类源码阅读

    ReentrantLock内部由Sync类实例实现. Sync类定义于ReentrantLock内部. Sync继承于AbstractQueuedSynchronizer. AbstractQueue ...

  2. 简单的实现QQ通信功能(三)

    第三部分:登陆界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)仿照QQ的登陆界面,右上角放了三个Label,用来做关闭.最小化和设置,使用了它们的Click事件当做按钮 ...

  3. 跨时钟域设计【二】——Fast to slow clock domain

    跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock dom ...

  4. Magento的布局(Layout),块(Block)和模板(Template)

    public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...

  5. HDU-1034(简单模拟)

    Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. java Spring集合

    在进行输入的时候一定要给属性配置set方法,因为不设置是注入不了的. 1.list UserService.java private ArrayList arr; public ArrayList g ...

  7. HTML5 PC、Mobile调用摄像头(navigator.getUserMedia)

    废话少说,先贴上代码 html: <div id="main" class="masthead"> <div id="face_sc ...

  8. C#微信公众号开发 -- (五)自定义菜单创建

    公众号中,底部都是有自己定义的功能按钮,通过点击某个按钮来实现指定的业务逻辑操作. 下面就来说说这些按钮是怎样放到微信公众平台的,还是先来看看微信的官方解释: 请注意: 1.自定义菜单最多包括3个一级 ...

  9. linux x64下编译libjpeg,libpng,zlib

    libJpeg编译: 下载libjpeg源码:http://www.ijg.org/,下载jpegsrc.v9a.tar.gz 解压源码,命令:tar -zxvf jpegsrc.v9a,源码文件夹为 ...

  10. JavaScript高级程序设计(二):在HTML中使用JavaScript

    一.使用<script>元素 1.<script>元素定义了6个属性: async:可选.表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本 ...