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的更多相关文章
随机推荐
- linux服务器下tomcat部署项目内存溢出
今天将一个项目部署到linux服务器上,结果tomcat在启动运行到一定时间后就报错.根据以往的经验,查了一些资料,终于解决了该问题并顺便解决了生产环境中的get方式中文传递乱码问题. tomcat启 ...
- Spring-data-redis操作redis cluster
Redis 3.X版本引入了集群的新特性,为了保证所开发系统的高可用性项目组决定引用Redis的集群特性.对于Redis数据访问的支持,目前主要有二种方式:一.以直接调用jedis来实现:二.使用sp ...
- SMTP ERROR: Password command failed: 535 Incorrect authentication data
在处理一个使用PHPMailer来发送电邮,我在本地使用我的163邮箱来做测试发送电邮,能够成功的发送电邮:当上传到正式平台时,出现了,类似这样的错误信息 SMTP ERROR: Password c ...
- overflow:hiddden与绝对定位的应用场景的事例
做一个点击查看显示详细信息的效果. 说一下问题描述,最外面的父元素overflow-parent设置了overflow:hidden, 然后子元素overflow-child没有设置overflow, ...
- export命令和import命令 详解
export命令 模块功能主要由两个命令构成:export和import. export命令用于用户自定义模块,规定对外接口: import命令用于输入其他模块提供的功能,同时创造命名空间(names ...
- Android 设计随便说说之简单实践(消息流动)
在上面两篇分别说明了设计中较为简单也是很关键的实践点. 第一模块划分,它是根据每个模块所承载的业务,进行划分,是应用程序一个静态的描述. 第二合理组合,它是是将每个模块调动起来,共同实现业务,是一个准 ...
- 对进度条progressbar的调整
进度条的理解,感觉这个进度条不是那么简单,系统给我们定制了几个普通的,但是如果还需要有更加好的效果,需要自己去调试. <ProgressBar android:layout_width=&quo ...
- 时间处理总结(三)javascript与WCF
1.WCF提交时间时,若需接受DateTime需转换为"\/Date(928120800000+0800)\/"这种格式 var DateToJson = function (js ...
- html-----014---统一资源定位器
HTML 统一资源定位器 URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上冲浪时,会键入网址的域名,因为名称比 ...
- UVA 11991 Easy Problem from Rujia Liu?(vector map)
Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...