树状数组(区间,单点间操作)
假设一维数组为A[i]( i=1 ,2,…n ),则与它对应的树状数组C[i](i=1 ,2,…n)是这样定义的:
C1 = A1
C2 = A1 + A2
C3 = A3
C4 = A1 + A2 + A3 + A4
C5 = A5
C6 = A5 + A6
C7 = A7
C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8
……
C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16
……
一个有趣的性质
第C(x)管辖的区域为:2^k(k为二进制末尾的0的个数)
比如:
C(8) 8的二进制为1000 所以 k=3 2^3=8
int lowbit (int x)//计算C(x)展开的项数
{return x&-x;
}
X即为数组的下标
意义:计算2^k的值,即C(x)管辖的区域
第二个函数:
int add (int x,int b)
{while(x<=MAXN){Tree(x)+=b;x+=lowbit(x);}
}
解释:
1:b是增量在树的结构中,每次增加b,即为修改了多少,是一个变量。修改了A(x)的值,会一直追溯到最终的父节点。
比如:A(2)增加了b,则该循环使其父节点依次增加b个单位。
C(2) C(4) C(8) 依次增加了b个单位。
2:x是数组的下标。
第三个函数:
int sum (int x)
{int ret=0;while(x>0){ret+=tree[x];x-=lowbit(x);}return ret;
}
解释:
1:求出范围a-b的和
Sum(b)-sum(a)即为所求。
求数列A[]的前n项和,只需找到n以前的所有最大子树,把其根节点的C加起来即可。
如:Sum(1)=C[1]=A[1];
Sum(2)=C[2]=A[1]+A[2];Sum(3)=C[3]+C[2]=A[1]+A[2]+A[3];Sum(4)=C[4]=A[1]+A[2]+A[3]+A[4];Sum(5)=C[5]+C[4];Sum(6)=C[6]+C[4];Sum(7)=C[7]+C[6]+C[4];Sum(8)=C[8];
一:区间修改,单点查询
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1556
**
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include <cstdlib>
#include <cstdio>
#include <map>
#define lson l,m,i<<1
#define rson m+1,r,i<<1|1
#define lowbit(x) (x&(-x))
using namespace std;const int MAXN = 100000;
const int LEN = MAXN + 100;
int tree[LEN];
int N;
void Add(int x,int p)//
{while(x<=N){tree[x] += p;x += lowbit(x);}
}
int Query(int x)
{int sum = 0;while(x){sum += tree[x];x -= lowbit(x);}return sum;
}
int main()
{while(cin>>N&&N){memset(tree,0,sizeof(tree));for(int i = 1; i <= N; i++){int a,b;scanf("%d %d",&a,&b);Add(a,1);Add(b+1,-1);}for(int i = 1; i <= N; i++){if(i>1)printf(" ");printf("%d",Query(i));}cout<<endl;}return 0;
}
**
二 :单点修改,区间查询
**
int low_bit(int x)
{return x&(-x);
}
void add(int i,int c)
{while(i<=n) //n是一共有多少点{a[i]+=c;i+=low_bit(i);}
}
int q(int i)
{int ans=0;while(i>0){ans+=a[i];i-=low_bit(i);} return ans;
}
int main()
{add(i,c); // i是对那个点增加 c 是要增加的多少 //若查询 l--r 区间的和ans=q(r)-q(l-1);
}
**
三 :区间修改,区间查询
**
略……………
部分转载自:https://blog.csdn.net/qq_24653023/article/details/46991325
树状数组(区间,单点间操作)相关推荐
- 树状数组(单点修改,区间修改等)
前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...
- 树状数组区间修改和区间求和
最一般树状数组能做到的操作是单点修改,区间求和,都是log(n)级别的.原理就是用树状数组维护a[i]的部分和. 想要做到修改区间,求单点值也很简单,用树状数组维护a[i]的差分数组d[i]的部分和既 ...
- UESTC 1601 艾尔大停电2 二维树状数组+区间更新
艾尔大停电2 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- 树状数组(单点+区间的所有操作)
转载:https://blog.csdn.net/I_believe_CWJ/article/details/80374326 更简洁方便的数据结构--树状数组(基于线段树的实现) 1.单点更新+区间 ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- Color the ball(树状数组区间更新+单点求值)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...
- 树状数组 区间update/query
Re [问题引入] 对于区间修改.区间查询这样的简单问题,打一大堆线段树确实是不划算,今天来介绍一下区间查询+区间修改的树状数组 [一些基础] 树状数组的基本知识不再介绍,请自行百度 我们假设sigm ...
- 校门外的树——树状数组+区间修改
校门外的树 [题目分析]题目描述的是一种区间修改,看起来好像要用线段树.但是对于这种区间内部没有差别并且查询的是区间内的类别的问题,是可以转化为树状数组进行的.毕竟树状数组更加简单. 我们的关注点应该 ...
最新文章
- 思科面试题c语言,C语言面试题~总汇(基础题、嵌入式、微软、华为、思科……).doc...
- hexo github pages 搭建博客
- 【struts2】struts2配置文件—struts.properties
- 用计算机怎么录资料,如何在短时间内快速录入大量数据 -电脑资料
- 数据库MySQL/mariadb知识点——日志记录(2)二进制日志
- Httpclient远程调用WebService示例
- 080520 雨 大风
- opencv图像分析与处理(14)- 图像压缩基础知识
- OpenCV-Python教程(7、Laplacian算子)
- 活性(Liveness)
- u盘win7纯净版_如何制作纯净版WIN7启动U盘
- 机器人路径规划_人工蜂群算法
- 腾讯浏览服务X5内核集成
- 理解类8583报文协议
- Windows 10做了这9项优化 电脑跑得比谁都快
- pandas 取excel 中的某一列_干货Python Pandas 做数据分析之玩转 Excel 报表分析
- 网络库libevent、libev、libuv、libhv对比
- File的了解与使用
- 每天坚持慢跑30分钟,一个月身体会有什么变化?
- 用户账户限制,可能的原因包括不允许空密码,登录时间限制,或强制的策略限制...
热门文章
- vuex实现及简略解析
- Nginx的静态文件合并请求,加快网站的加载速度
- Tomcat+MySql+jdbc
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
- 使用@Transactional(SUPPORTS)和不加@Transactional 有什么区别?
- C++中const与指针、引用的分析(转自china_unix GP-King)
- mybatis逆向工程详解
- Java实现mysql的读写分离
- sicp 3.9题解答
- tomcat 7配置ssl教程