题目: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+二叉索引树的更多相关文章

  1. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  2. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

  3. #5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25232   Accepted: 7503 Descr ...

  4. POJ 3321 Apple Tree DFS序+fenwick

    题目大意:有一颗长满苹果的苹果树,有两个操作. 1.询问以一个点为根的子树中有多少个苹果. 2.看看一个点有没有苹果,假设没有苹果.那么那里就立即长出一个苹果(= =!):否则就把那个苹果摘下来. 思 ...

  5. POJ 3321 Apple Tree (DFS + 树状数组)

    题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...

  6. POJ 3321 Apple Tree DFS序 + 树状数组

    多次修改一棵树节点的值,或者询问当前这个节点的子树所有节点权值总和. 首先预处理出DFS序L[i]和R[i] 把问题转化为区间查询总和问题.单点修改,区间查询,树状数组即可. 注意修改的时候也要按照d ...

  7. POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)

    id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...

  8. 二叉索引树BIT

    定义     二叉索引树,binary index tree,又名树状数组,或Fenwick Tree,因为本算法由Fenwick创造.     对于数组A,定义Query(i,j) = Ai +Ai ...

  9. HDU 1166 敌兵布阵(线段树 or 二叉索引树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=50000),表示敌人有 ...

随机推荐

  1. Android两个控件叠在一起,如何让被挡住的控件显示出来

    Android两个控件叠在一起,如何让被挡住的控件显示出来 问题 : 两个控件叠在一起,如何让被挡住的控件显示出来? 比如A,B两个控件,A被B挡住,目前A要显示出来,B不能被隐藏,A的高度只有那么一 ...

  2. CentOS下挂载U盘

    插入U盘提示: [sdb] No Caching mode page present [sdb] Assuming drive cache: write through 再用fdisk -l 来查看U ...

  3. Bluetooth in Android 4.2 and 4.3(三):Enable Bluetooth

    以下是基于Android 4.2代码,对Bluetooth BR/EDR Enable process的分析.BluetoothAdapter类代表的是local device Bluetooth a ...

  4. web工程中spring+ibatis的单元测试--转载

    为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...

  5. js 字符及字符串

    1. 判断是否为null或者空字符 var == null var == undefined var == '' 2. 字符串及其分割 var arr = new Array(); //定义一数组 a ...

  6. tarball文件安装的大概流程

    ./configure这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统.相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装 ...

  7. 设置background属性使用selector的时候内置?attr报错的解决方案

    当我们设置background属性的时候可以设置background="@color/black" 也可以设置 background="@drawable/selecto ...

  8. air2调用本地exe的文章

    流传了两种配置app.xml的方法,分别是: <supportedProfiles>extendedDesktop</supportedProfiles>  <suppo ...

  9. (转)我所理解的OOP——UML六种关系

    原文地址:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱 ...

  10. jpGraph的应用及基本安装配置 BY 命运

    1.---jpGraph其实就是一个图表类库,会让开发者们作图非常方便,只要几行代码就可以勾画出非常炫的图表. 官方下载地址是:http://jpgraph.net/download/   jpGra ...