题目:http://poj.org/problem?id=3321
动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建好,只要重新标号成连续的就行了。
感觉重新标号是这个题最难的地方,否则就是个纯水题了。。。
重新标号是看的别人的。。。用dfs遍历多叉树标号。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int item = ;
int c[], n;
int start[], end[]; struct Tree
{
int num;
struct Tree *next;
Tree()
{
next = NULL;
num = ;
}
}tree[]; int lowbit(int x)
{
return x & (-x);
} void add(int x, int y)
{
while(x <= n)
{
c[x] += y;
x += lowbit(x);
}
} int sum(int x)
{
int ret = ;
while(x)
{
ret += c[x];
x -= lowbit(x);
}
return ret;
} int query(int x, int y)
{
return sum(y) - sum(x-);
} void dfs(int x)
{
start[x] = ++item;
struct Tree *p = tree[x].next;
while(p != NULL)
{
if(start[p->num] == )
dfs(p->num);
p = p->next;
}
end[x] = item;
} int main()
{
int u, v;
scanf("%d", &n);
memset(tree, , sizeof(tree));
memset(start, , sizeof(start));
memset(c, , sizeof(c));
for(int i = ; i < n; i++)
{
scanf("%d %d", &u, &v);
struct Tree *p = new Tree;
p->num = v;
p->next = tree[u].next;
tree[u].next = p;
}
dfs();
for(int i = ; i <= n; i++)
{
add(i, );
}
int q, z;
char cmd[];
scanf("%d", &q);
while(q--)
{
scanf("%s %d", cmd, &z);
if(cmd[] == 'Q')
{
printf("%d\n", query(start[z], end[z]));
}
else
{
if(sum(start[z]) - sum(start[z]-) == )
add(start[z], -);
else add(start[z], );
}
}
return ;
}
POJ 3321 Apple Tree dfs+二叉索引树的更多相关文章
-
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
-
poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
-
#5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25232 Accepted: 7503 Descr ...
-
POJ 3321 Apple Tree DFS序+fenwick
题目大意:有一颗长满苹果的苹果树,有两个操作. 1.询问以一个点为根的子树中有多少个苹果. 2.看看一个点有没有苹果,假设没有苹果.那么那里就立即长出一个苹果(= =!):否则就把那个苹果摘下来. 思 ...
-
POJ 3321 Apple Tree (DFS + 树状数组)
题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...
-
POJ 3321 Apple Tree DFS序 + 树状数组
多次修改一棵树节点的值,或者询问当前这个节点的子树所有节点权值总和. 首先预处理出DFS序L[i]和R[i] 把问题转化为区间查询总和问题.单点修改,区间查询,树状数组即可. 注意修改的时候也要按照d ...
-
POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...
-
二叉索引树BIT
定义 二叉索引树,binary index tree,又名树状数组,或Fenwick Tree,因为本算法由Fenwick创造. 对于数组A,定义Query(i,j) = Ai +Ai ...
-
HDU 1166 敌兵布阵(线段树 or 二叉索引树)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=50000),表示敌人有 ...
随机推荐
-
【腾讯bugly干货分享】微信Android热补丁实践演进之路
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1264& ...
-
机器学习实战笔记(Python实现)-00-readme
近期学习机器学习,找到一本不错的教材<机器学习实战>.特此做这份学习笔记,以供日后翻阅. 机器学习算法分为有监督学习和无监督学习.这本书前两部分介绍的是有监督学习,第三部分介绍的是无监督学 ...
-
数据bus
moo的Hessian总线的数据通信模式大致为: Hessian 格式:基于二进制格式的用于网络传输的协议.Hessian格式数据流的是实现 java.io.Serializable接口.当两个进程在 ...
-
Silverlight管理系统源代码(SilverlightOAFlame开发框架主要提供二次开发)
Silverlight OA系统简介 系统功能简介 l 程序界面介绍: 左侧为主菜单,主菜单可以展开和收起,主菜单下面的所有模块都可以在数据库中扩展增加,模块的权限和用户角色挂钩,可以在数据库中创建多 ...
-
HTTP 头部详细解释
HTTP 头部解释 ================================================ Accept 告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,ty ...
-
BZOJ4012 [HNOI2015]开店
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
-
Learn know more about big data
As we all know,we are in a big data age now."Every sword has two slides",as a ITer,we shou ...
-
OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
-
java基础知识回顾之java Socket学习(一)--UDP协议编程
UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地.不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点.就像寄 ...
-
PHP克隆魔术方法
克隆对象 __clone() $p2=clone $p; $p=>say(); 克隆对象的时候自动调用的方法 作用和构造方法一样是对新克隆的对象进行初始化 在这个方法中$this是副本所以可以给 ...