浅谈树状数组(为什么lowbit(x)=x&(-x)
树状数组是一种支持单点修改和查询前缀和的数据结构 网上很多讲解它的博客了 这里重点讲一下为什么lowbit(x)=x&(-x)
树状数组代码量相对于线段树基本可以不计(太好写了) 因此NOIp基本不考(?)
但是作为最好写的树状结构 值得好好理解
关于为什么LOWBIT( X ) = X &( -X )
lowbit 要的是你从末尾开始第1个 1 所代表的值
example:13=1101(8+4+1)所以LOWBIT(13)= 1;
那么暴力写一个lowbit就是
#include<bits/stdc++.h>
using namespace std;
long long lowbit(long long x){
int ans=1;
while (1){
if( x & 1 ) return ans;
else {
x=x>>1;
ans=ans<<1;
}
}
}
int main()
{
long long n;
cin>>n;
cout<<lowbit (n);
return 0;
}
如果有什么运算符不懂就去百度吧~~~讲的很清楚
但是实际上我们有更好的做法。
要理解为甚LOWBIT(X)=X&-X 要先去百度 反码 和 补码 (超链接都帮你做好了不点一下吗)
欢迎回来 现在我们来聊原理
x变成负数时 他末尾的0全变成1 然后加1又全都变成0
还是举个例子13=1101 反码变成0010 加1变成0011
按位与一下 只有末尾和他都是1 于是lowbit(13)=1
16=10000 反码变成01111 加1变成10000
按位与时变成10000即16
负数完美的帮你进行了一个反位加1的操作
帮你把原来末尾上一连串的零变成1
再变成0
在最后一堆零的前一位留了一个1 而你要做的就是找见那个1在哪
如果这个位原来是1 反位加1让他不变 那么肯定这个位原来以前全是0000
所以就出来了 非常巧妙
每一个数组的区间范围为【x-lowbit[x]】~【x】
剩下的翻翻其他人博客就对上啦 祝你好运
TAG:SIN_XIII ⑨
浅谈树状数组(为什么lowbit(x)=x&(-x)的更多相关文章
- (新人的第一篇博客)树状数组中lowbit(i)=i&(-i) 的简单文字证明
第一次写博好激动o(≧v≦)o~~初一狗语无伦次还请多多指教 先了解树状数组http://blog.csdn.net/int64ago/article/details/7429868感觉这个前辈写 ...
- BIT 树状数组 详解 及 例题
(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组 ...
- HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树
HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...
- poj 2299 树状数组求逆序数+离散化
http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...
- POJ3321Apple Tree Dfs序 树状数组
出自——博客园-zhouzhendong ~去博客园看该题解~ 题目 POJ3321 Apple Tree 题意概括 有一颗01树,以结点1为树根,一开始所有的结点权值都是1,有两种操作: 1.改变其 ...
- poj3321 dfs序+树状数组单点更新 好题!
当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题 树的dfs序映射在树状数组上进行单点修改,区间查询. /* 树状数组: lowbit[i] = i&-i C[i] = a[i-l ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- poj-1195(二维树状数组)
题目链接:传送门 题意:给出操作,按照操作进行. 思路:将树状数组设置为二维的就行了. 注意: (1)每次求出的面积是S(x2,y2)-S(x1-1,y2)-S(x2,y1-1)+S(x1-1,y1- ...
- PAT甲级题解-1057. Stack (30)-树状数组
不懂树状数组的童鞋,正好可以通过这道题学习一下树状数组~~百度有很多教程的,我就不赘述了 题意:有三种操作,分别是1.Push key:将key压入stack2.Pop:将栈顶元素取出栈3.PeekM ...
随机推荐
- ORA-01555错误
有这样一种情况 0:00 我们开始查询,查询的数据是100万条 0:01 一个session update了第100万条数据 0:01 update提交了,完成 1:00 我们的查询还在继续,只读到了 ...
- [elk]elasticsearch dsl语句
例子1 统计1,有唱歌兴趣的 2,按年龄分组 3,求每组平均年龄 4,按平均年龄降序排序 sql转为dsl例子 # 每种型号车的颜色数 > 1的 SELECT model,COUNT(DISTI ...
- eclipse打包jar包
项目右键 选择Export 选择java文件夹 选择 JAR file选择包,类,选择导出路径然后 Finish
- Linux下安装pymysql
直接使用pip进行安装: [root@mycentos ~]#pip install pymysql
- Docker 基础 (二)
网络管理 容器网络模式 Docker支持5种网络模式 bridge 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中 host 容器不会获得一个独立的n ...
- Java IO--BIO
一.java io 概述 1.1 相关概念 Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这 ...
- select2的用法
<link href="../css/select2.min.css" rel="stylesheet" /> <script src=&qu ...
- CSS 使用技巧
CSS 使用技巧 1.CSS代码重用,解决同一类样式下相同冲突点 <style> .c { 共有 } .c1 { 独有 } .c2 { 独有 } </style> <di ...
- mybatis 查询优化主子表查询之association和collection
很多开发人员之所以编写出低效的应用,有一大原因是并不理解怎样编写高效的SQL.以订单查询为例,我们经常需要查询某个用户的订单以及订单明细,并且以树形方式展现如下: 对于这种性质的功能,很多开发人员的做 ...
- centos6.5安装zabbix3.2
1.安装PHP Zabbix 3以后对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh ...