当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题

树的dfs序映射在树状数组上进行单点修改,区间查询。

/*
树状数组:
lowbit[i] = i&-i
C[i] = a[i-lowbit[i]+1]+...+a[i] 求和:
设sum[k] = a[1]+a[2]+...+a[k]
则a[i]+a[i+1]+...+a[j] = sum[j]-sum[i-1]
在树状数组上:sum[k] = C[n1]+C[n2]+...+C[k]
n1 = n2-lowbit[n2]... >0 更新:
如果a[i]更新了,则以下几项也要更新
C[n1], C[n2], ... C[nm]
n1 = i, n2 = n1+lowbit[n1].. nm<=N 建树:O(N)
C[k] = sum[k]-sum[k-lowbit[k]] poj3321
树状数组:单点更新
书上长满了苹果,每一个节点有长苹果和不长两种状态
操作1:改变树枝上有无苹果的状态
操作2:询问某一树枝节点以下的所有的苹果有多少 做一次dfs,几下每个节点的开始时间Start[i]和结束时间End[i]
对于i节点的所有子孙的开始时间和结束时间都应该位于Start[i]和End[i]之间
C[i]是树状数组节点对应的苹果数 然后用树状数组C统计Start[i]到End[i]之间的附加苹果总数
树状数组统计区间可以用Sum(End[i])-Sum(Start[i]-1)来计算
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define MAXN 220000
using namespace std;
int C[MAXN];
vector<vector<int> > G(MAXN/);//树
int Lowbit[MAXN];
int Start[MAXN];
int End[MAXN];
bool HasApple[MAXN/];
int nCount;
//dfs搜索出所有状态
void dfs(int v){
Start[v] = ++nCount;
for (int i = ; i != G[v].size(); i++)
dfs(G[v][i]);
End[v] = ++nCount;
}
//求1-p的和
int QuerySum(int p){
int nSum = ;
while(p > ){
nSum += C[p];
p -= Lowbit[p];
}
return nSum;
}
//修改节点p的值
void Modify(int p, int val){
while(p <= nCount){
C[p] += val;
p += Lowbit[p];
}
}
int main(){
int n;
scanf("%d", &n);
int x, y;
int i, j, k;
for (i = ; i < n-; i++){
int a, b;
scanf("%d%d", &a, &b);
G[a].push_back(b);
}
nCount = ;
dfs();//从根节点开始dfs //树状数组要处理的原石数组下标范围
for (i = ; i <= nCount; i++)
Lowbit[i] = i&(-i); for(i = ; i <= n; i++)
HasApple[i] = ; int m;
//建树求C数组,即树状数组的节点值
for(i = ; i <= nCount; i++)
C[i] = i-(i-Lowbit[i]);
//C[i] = Sum[i] - Sum[i-Lowbit[i]]; scanf("%d", &m);
for (int i = ; i < m; i++){
char cmd[];
int a;
scanf("%s%d", cmd, &a);
//改变某个节点上的苹果的状态
if (cmd[] == 'C') {
if(HasApple[a] == ){
Modify(Start[a], -);
Modify(End[a], -);
HasApple[a] = ;
}
else {
Modify(Start[a], );
Modify(End[a], );
HasApple[a] = ;
}
}
//查询某个节点上的苹果
else {
int t1 = QuerySum(Start[a]-);
int t2 = QuerySum(End[a]);
cout << (t2-t1)/ << endl;
}
}
}

poj3321 dfs序+树状数组单点更新 好题!的更多相关文章

  1. 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  2. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  3. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  4. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  5. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+ 树状数组或线段树

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  6. HDU 3887:Counting Offspring(DFS序+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...

  7. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  8. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  9. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

随机推荐

  1. Spring架构简单描述

    原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻量级Java SE(Jav ...

  2. spring boot 2.0.3+spring cloud (Finchley)2、搭建负载均衡Ribbon (Eureka+Ribbon+RestTemplate)

    Ribbon是Netflix公司开源的一个负载均衡组件,将负载均衡逻辑封装在客户端中,运行在客户端的进程里. 本例子是在搭建好eureka的基础上进行的,可参考spring boot 2.0.3+sp ...

  3. Python排序算法之冒泡排序

    冒泡排序 顾名思义,冒泡排序直观的意思是气泡越大冒的越快:),对应到我们的列表中就是数字最大的先选出来,然后依次进行.例如 myList = [1,4,5,0,6],比较方式为: 相邻的两个数字先进行 ...

  4. OpenCV中MAT中数据类型的设置(转)

    前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...

  5. POJ3436 ACM Computer Factory【EK算法】

    题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大 ...

  6. (原创 开源)AppWidge的使用—桌面便利贴

    Android平台的一大特色就是支持桌面插件——AppWidget. 且不说,AppWidget是否会影响系统的流畅性,AppWidget确实是满足了用户个性化和快捷操作的需要. 常见的AppWidg ...

  7. 3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用栈“先进后出”的性质,将链表的值存入到栈里,然后将栈里的值存入到构建好的容器里,最后打印容器. class So ...

  8. 设置PHPStorm 注释

    /** * Desc: xxx#if (${NAME}) * Class: ${NAME}#end#if (${NAMESPACE}) * Package: ${NAMESPACE}#end * Us ...

  9. mysql 案例 ~ pt修复工具的使用

    简介:今天咱们来聊聊PT修复工具pt-table-sync 注意事项:   1 表要有主键或者唯一键   2 针对每一个chunk加的是for update锁   3 修复过程中不能容忍从库延迟 如果 ...

  10. 课程4:黑马程序员_spring2.5视频教程--视频列表

    \黑马程序员_spring2.5视频教程\01Struts相关基础理论介绍.mp4; \黑马程序员_spring2.5视频教程\02搭建struts开发环境.mp4; \黑马程序员_spring2.5 ...