POJ 3321 Apple Tree dfs+二叉索引树
题目: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),表示敌人有 ...
随机推荐
- Android两个控件叠在一起,如何让被挡住的控件显示出来
Android两个控件叠在一起,如何让被挡住的控件显示出来 问题 : 两个控件叠在一起,如何让被挡住的控件显示出来? 比如A,B两个控件,A被B挡住,目前A要显示出来,B不能被隐藏,A的高度只有那么一 ...
- CentOS下挂载U盘
插入U盘提示: [sdb] No Caching mode page present [sdb] Assuming drive cache: write through 再用fdisk -l 来查看U ...
- Bluetooth in Android 4.2 and 4.3(三):Enable Bluetooth
以下是基于Android 4.2代码,对Bluetooth BR/EDR Enable process的分析.BluetoothAdapter类代表的是local device Bluetooth a ...
- web工程中spring+ibatis的单元测试--转载
为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...
- js 字符及字符串
1. 判断是否为null或者空字符 var == null var == undefined var == '' 2. 字符串及其分割 var arr = new Array(); //定义一数组 a ...
- tarball文件安装的大概流程
./configure这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统.相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装 ...
- 设置background属性使用selector的时候内置?attr报错的解决方案
当我们设置background属性的时候可以设置background="@color/black" 也可以设置 background="@drawable/selecto ...
- air2调用本地exe的文章
流传了两种配置app.xml的方法,分别是: <supportedProfiles>extendedDesktop</supportedProfiles> <suppo ...
- (转)我所理解的OOP——UML六种关系
原文地址:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱 ...
- jpGraph的应用及基本安装配置 BY 命运
1.---jpGraph其实就是一个图表类库,会让开发者们作图非常方便,只要几行代码就可以勾画出非常炫的图表. 官方下载地址是:http://jpgraph.net/download/ jpGra ...