学习笔记 BIT(树状数组)
痛定思痛,打算切割数据结构,于是乎直接一发BIT
树状数组能做的题目,线段树都可以解决
反之则不能,不过树状数组优势在于编码简单和速度更快
首先了解下树状数组:
树状数组是一种操作和修改时间复杂度都是O(logN)的数据结构,可以做到 单点修改前缀查询 和 区间修改单点查询
下面来看下树状数组:
由图发现
树状数组C[]对应的数组A[]中的值是这样的:
C【1】=A【1】
C【2】=C【1】+A【2】=A【1】+A【2】
C【3】=A【3】
C【4】=C【2】+A【4】=A【1】+A【2】+A【4】
……
于是乎,神犇们发现了一个性质:
C【n】=A【n-2^k+1】+……+A【n】(k为n二进制末尾0的个数)
通常把2^k叫做lowbit
那么求lowbit的方法:
int lowbit(int x)
{
return x&(-x);//原理是计算机的补码存储方式(反正看不懂且不会考,记住就好)
}
查询:
通过查询前缀和相减即区间和
int sum(int locate)
{
int total=0;
while (locate>0)
{
total+=C[locate];
locate-=lowbit(locate);
}
return total;
}//前缀和查询
修改:
修改需要修改所有和这个有关的点
void add(int locate,int number)
{
while (locate<=n)
{
C[locate]+=number;
locate+=lowbit(locate);
}
}//单点修改
优点是时间复杂度低,但应用面窄,只适合维护求和这一问题,不支持乱搞
区间修改点查询:
假如说要对[l,r]这个区间的每一个元素加2,那么在l位置加2,在r+1位置减2。查询某个点的权值的时候,查询到该点的前缀和
二维树状数组:
或者说 树状数组套树状数组(B格更高)
void change(int x,int y,int number)
{
for (int i=x; i<=n; i+=lowbit(i))
for (int j=y; j<=n; j+=lowbit(j))
C[i][j]+=number;
}
int sum(int x,int y)
{
int total=0;
for (int i=x; i>0; i-=lowbit(i))
for (int j=y; j>0; j-=lowbit(j))
total+=C[i][j];
return total;
}
下面是两个模版题传送门:
hdu 1166 树状数组模版题:
http://blog.csdn.net/dad3zz/article/details/49999687
poj 2155 树状数组套树状数组模版题:
http://blog.csdn.net/DaD3zZ/article/details/49999777
学习笔记 BIT(树状数组)的更多相关文章
- HDU1087(树状数组求LIS)
题是水题,学习一下用树状数组求LIS. 先离散化一下,注意去重:然后就把a[i]作为下标,dp[i]作为值,max作为维护的运算插进树状数组即可. 如果是上升子序列,询问(a[i] - 1):如果是不 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- 树状数组的笔记√(hzwer blog)
int lowbit(int x) { return x&(-x); } lowbit()的返回值就是 2^k 次方的值. 求数组的和的算法: (1)首先,令sum=0,转向第二步: (2)接 ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- ACM学习历程—HDU5700 区间交(树状数组 && 前缀和 && 排序)
http://acm.hdu.edu.cn/showproblem.php?pid=5700 这是这次百度之星初赛2B的第五题.省赛回来看了一下,有这样一个思路:对于所有的区间排序,按左值排序. 然后 ...
- ACM学习历程—SNNUOJ 1239 Counting Star Time(树状数组 && 动态规划 && 数论)
http://219.244.176.199/JudgeOnline/problem.php?id=1239 这是这次陕西省赛的G题,题目大意是一个n*n的点阵,点坐标从(1, 1)到(n, n),每 ...
- ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592 题目大意就是给了每个[1, i]区间逆序对的个数,要求复原原序列. 比赛的时候2B了一发. 首先 ...
- ACM学习历程—UESTC 1217 The Battle of Chibi(递推 && 树状数组)(2015CCPC C)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) = ...
- ACM学习历程—HDU4417 Super Mario(树状数组 && 离线)
Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...
随机推荐
- uGUI练习(六) ScrollView
练习目标 练习uGUI的滑动组件 一.相关组件 ScrollRect Mask Grid Layout Group Scrollbar 二.步骤 1.创建一个Panel,命名为ScrollRect,添 ...
- Linux命令学习-mkdir
1. [root@www tmp]# mkdir test <=建立一名为 test 的新目录 2. [root@www tmp]# mkdir -p /opt/tmp/abc < ...
- javascript去掉空格
1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明 ...
- 12个JavaScript技巧
转自:http://web.jobbole.com/86146/ 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操 ...
- WPF - MVVM - 如何将ComboBox的Selectchange事件binding到ViewModel
转:http://www.cnblogs.com/mantian/p/3713524.html 将所有的事件,属性,都映射到ViewModel中.好处多多,以后开发尽量用这种模式. 解决方法: 使用S ...
- JAVA 根据数据库表内容生产树结构JSON数据
1.利用场景 组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段 2.构造数据(以下数据并不是组织机构数据,而纯属本人胡编乱造的数据) List ...
- 工作流模式与K2实现--(2)
结构化过程 这两个模式的共同点在于:模式所涉及流程的执行路径是由运行时决定的,而非设计时确定.包括:Arbitrary cycles(强制循环模式) .Implicit termination( ...
- 转载:有关SQL server connection Keep Alive 的FAQ(3)
转载:http://blogs.msdn.com/b/apgcdsd/archive/2012/06/07/sql-server-connection-keep-alive-faq-3.aspx 这个 ...
- 一份高级Java招聘要求
搜了一些招聘,发现自己还有很长的路要走啊,学无止境...... 摘一个典型的招聘要求,如下: 1.5年基于java的项目开发经验,2.熟悉基于 J2EE的相关开源技术以及Spring,Struts2, ...
- OAF 中对文字实现html效果及对超级长文本实现默认换行,对只读的messageTextInput中的内容自动换行
今天遇到一个需求,客户注册页面客户化了一个超级长的注册须知,内容很多.但是样式相对又要做起来好看点. 注册须知的内容使用多个message拼接而成. 老大说rawText支持html样式,于是我想到了 ...