poj3321 dfs序+树状数组单点更新 好题!
当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题
树的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序+树状数组单点更新 好题!的更多相关文章
- 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- 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 ...
- 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 ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- 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 ...
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
随机推荐
- CentOS下查找java环境变量
CentOS下通过命令查找java环境变量 [root@yuteng opt]# echo $JAVA_HOME /usr/java/default [root@yuteng opt]# which ...
- 匿名内部类中使用的外部局部变量为什么只能是final变量
被匿名内部类引用的变量会被拷贝一份到内部类的环境中 但其后,在外部,该变量如果被修改,则内部外部不一致 Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制. 究其原 ...
- Every-SG游戏
参考自 石家庄二中 贾志豪 IOI2009国家集训队论文 <组合游戏略述—— 浅谈 SG 游戏的若干拓展及变形> 一.定义 游戏规则加上 对于还没有结束的所有单一游戏,游戏者必须对其进行决 ...
- C# dll 在注册表中寻找
“{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”就是该Dll的唯一ID啦,每一个Dll文件都会不一样的. 但是,问题又来了,怎么样知道它的唯一ID呢?其实很简单,那就是 ...
- sql server存储过程简单的使用
--创建存储过程 create proc test_proc @date datetime as select * from t_user where times between ),),),),' ...
- [转]Linux/Windows下脚本对拍程序
[新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...
- linux space/mark设置
参考链接: http://blog.csdn.net/zhaozh2000/article/details/6460223 串口数据的发送: 数据的发送: 数据位+检验位+停止位, 进行数据的发送.( ...
- cdh部署
supermicro安装环境 本次安装基于无因特网的环境,共安装2个节点(一个master节点,一个data及节点),所用系统为centos7.x,所有安装过程均使用root用户.具体的节点信息如下: ...
- Python模块学习 - fnmatch & glob
介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特定的文件就能满足需求,如果需要更加灵活的字符串匹配,就没有办法了,这里 ...
- 七、Sparse Autoencoder介绍
目前为止,我们已经讨论了神经网络在有监督学习中的应用.在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 .自编码神经网络是一种无监督学习算法,它使用 ...