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. 1.Linux系统(CenntOS)固定IP的设定

    首先:我们配置一个临时的固定的固定ip,作用是让我们用其他的shell工具连接虚拟机 ifconfig eth0 192.168.10.168 在主机用ping命令查询连通后再进行下一步 ping 1 ...

  2. centos 7.x编写开机启动服务

    centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度.关 ...

  3. Bind开启IPv6功能

    [root@localhost sbin]# ./named -v bind 9.5.1-p3-v3.0.9 1,服务器开启IPv6服务 网卡配置v6地址 [root@localhost ~]# if ...

  4. static与get属性的作用

    一.Static 用于没有属性的类中,不用保存属性的值,例如 var user=new User(): user.Name="jack" 可以直接调用类中的方法,避免需要多次访问该 ...

  5. 安装完oracle重新启动后报ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务(重启前正常)

    安装完oracle重新启动后报ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务(重启前正常) 刚安装完后用plSql登录正常. 在dos命令行下 输入  sqlplus 用户 ...

  6. Excel对话框大全

    Excel对话框大全 序号 名称 描述 1 Application.Dialogs(1).Show 是调用打开对话框  2 Application.Dialogs(5或145).Show 是调用另存为 ...

  7. Centos学习手册——装逼宝典之强制重置密码

    ---恢复内容开始--- Centos学习手册by RuffianFish; 痞子鱼 近日闲的无聊,而最近又在搞Centos决定写个Centos详细的学习手册,以便自己在长时间没摸Centos的情况下 ...

  8. ubuntn svn 安装 配置

    参考文章  http://zhan.renren.com/itbegin?gid=3602888498033631485&checked=true 上面的文章说得很详细 sudo apt-ge ...

  9. redis 安装及配置

    一.安装Redis 1.到官网下载redis最新版本,我下载的是 http://redis.io/ 2.拷贝redis-3.0.3到/usr/local目录 3.解压缩sudo tar -zxf re ...

  10. Python里隐藏的 " 诗 "

    在 Python 的Lib目录里有一个:this.Py (或者在交互式解释器中输入import this) 它其实是隐藏的一首诗 The Zen of Python, by Tim Peters &l ...