知识点1-树状数组[带poj Stars作为巩固]
转自:https://blog.csdn.net/flushhip/article/details/79165701#commentBox
1.首先其中讲到了一个问题,就是如何求一个数的二进制表示的最末位的1.
int lowbit(x)
{
return x & -x;
}
用这个即可。假设x=5,那么x的二进制就是0101,-x的二进制1011.(负数补码是除符号位外,从右边起遇到第一个1将其左边取反,并+1)
主要原因是,负数在计算机中是以补码来存储的。所以是这么样子的。(首位表示符号位),运行结果如下:

对于x=8来说,也是同样的到离,没毛病。
2.查询前缀和代码
int sum(int x, ArrayInt c, int n)
{
int ret = ;
for ( ; x > ; ret += c[x], x -= lowbit(x));
return ret;
}
//感觉也是比较好理解的,
比如x=6,那么c[x]所包含的和都有谁呢?
lowbit(6)=2,那么只包含两个数 即a[5]和a[6].
所以一次for循环之后,ret中是5.6的和;
第二次for循环中,x=4.
lowbit(4)=4,那么即包含1,2,3,4的和,此时ret就包含了1~4的和,返回。
3.更新后缀和
void update(int x, int val, ArrayInt c, int n)
{
for ( ; x <= n; c[x] += val, x += lowbit(x));
}
比如此时x=5,那么就需要知道如果5被更新了,都有哪个c和需要被更新,
当然首先是5,接着lowbit(5)=1,那么x=6;更新6,接着lowbit(6)=2,x=8;
更新8,此时x=12退出循环。
总:感觉更新后缀和比较难理解。总是就是,查询前缀和是一直-lowbit(x),更新后缀和就是一直+lowbit(x)即可。
从这里也理解了一些思想,对于数据结构无非就是“增删改查”。针对的就是单点更新,区间查询问题。
最后一张经典图进行理解:

题目
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 54809 | Accepted: 23580 |
Description

For example, look at the map shown on the figure above. Level of the star number 5 is equal to 3 (it's formed by three stars with a numbers 1, 2 and 4). And the levels of the stars numbered by 2 and 4 are 1. At this map there are only one star of the level 0, two stars of the level 1, one star of the level 2, and one star of the level 3.
You are to write a program that will count the amounts of the stars of each level on a given map.
Input
Output
Sample Input
5
1 1
5 1
7 1
3 3
5 5
Sample Output
1
2
1
1
0
Hint
//emmm,还是不太会, 跟我理解的树状数组不太一样啊!
题目大意:从左到右,从上到下,给出星星的level,星星的level是其左和下所有的星星和。
代码来自:https://blog.csdn.net/ACMer_hades/article/details/46274927
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 32222
//这道题目很巧妙,首先是根据x的增长来的,然后再根据y的增长来排的;
//所以这样就能理解为什么每次就只要求x之前的就好了
int c[maxn];
int levels[maxn];
int lowbit(int x){
return x&(-x);
}
//这里是对前x进行求和;
int sum(int x){//求x左边有多少星星。
int res=;
while(x>){ //注意这里是x>0,不能写成x>=0;
res+=c[x];
x-=lowbit(x);
}
return res;
}
//这里的目的是给下标为pos的加上1,这样的话下次询问前面的就能够累加上去了;
void update(int pos){
while(pos<=){//要加这么多的,所有包含当前的都加进来
c[pos]++;
pos+=lowbit(pos);
}
}
int main(){
int n,x,y;
while(~scanf("%d",&n)){
memset(levels,,sizeof(levels));
int tt=n;
while(tt--){
scanf("%d%d",&x,&y);
levels[sum(x+)]++;//因为坐标是从0开始的,但是树状数组是从1开始计算,所以+1.
update(x+);
}
for(int i=;i<n;i++) printf("%d\n",levels[i]);
}
}
//这代码真的很神。
我理解的误区其实就在,数据输入时已经按照y递增,y相同时,x递增来排序了,相当于从底向上,从左向右扫描。
不会出现计数不上的情况。厉害。
知识点1-树状数组[带poj Stars作为巩固]的更多相关文章
- 【树状数组】POJ 2352 Stars
/** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- 【树状数组】POJ 2155 Matrix
附一篇经典翻译,学习 树状数组 http://www.hawstein.com/posts/binary-indexed-trees.html /** * @author johnsondu * @ ...
- [树状数组]数星星 Stars
数 星 星 S t a r s 数星星 Stars 数星星Stars 题目描述 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 k k k 颗星星 ...
- 【树状数组】 poj 2352
题意:给出n个平面二维坐标,对于每个坐标,如果这个坐标跟(0,0)形成的矩形内包含的点数为 k (包含边界,但不包含坐标本身),那么这个坐标就是 level k.输出level 0 - n-1的点数分 ...
- 树状数组入门 hdu1541 Stars
树状数组 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次 ...
- 求逆序对常用的两种算法 ----归并排 & 树状数组
网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...
- 求逆序对 ----归并排 & 树状数组
网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...
- BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】
题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...
随机推荐
- 立即调用的函数表达式---IIFE
有些人则称为“自执行的匿名函数” 在闭包中,我们经常需要使用到匿名函数,我感觉闭包就是一种匿名函数,子集. 但是直接在匿名函数后面调用函数是会出错的.比如: function () { alert(& ...
- git for c#, commit本地,pushserver
//ok private static void push() { string wkDir = @"E:\DotNet2010\单位project\Git.Client\lib2Test\ ...
- 测试用例和BUG描述规范
欢迎关注我的公众号,了解更多的测试知识:[软件测试经验与教训] 一一BUG描述基础知识 Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题 ...
- scala的基础部分
最近接触到spark,spark又是scala编写的,所以需要学习一下scala. scala是面向对象的,一切皆为对象, 数值,函数都是对象. println("Welcome to th ...
- securecrt 的安装
http://bbs.feng.com/read-htm-tid-6939481.html ssh -t ip地址@用户名 -p 22
- vsftp服务启动失败
Linux下的服务如果启动失败,一般是看报错和日志进行排查的 报错看不出什么,那么就看下日志记录了什么/var/log/vsftpd.log: 一般是配置文件有问题 /etc/vsftpd/vsftp ...
- windows下配置nutch注意的问题
1.为处理方便,直接在$nutch目录下创建一个名为url.txt文件,然后在文件里添加要搜索的网址,例如:http://www.sina.com.cn/,注意网址最后的"/"一定 ...
- iOS - UITableView判断reloadData加载数据已经结束
问题: stackoverflow上有人提问这样的问题 http://stackoverflow.com/questions/16071503/how-to-tell-when-uitableview ...
- zookeeper-端口说明
一.zookeeper有三个端口(可以修改) 1.2181 2.3888 3.2888 二.3个端口的作用 1.2181:对cline端提供服务 2.3888:选举leader使用 3.2888:集群 ...
- [分享]方便的 windbg 命令 - !list
Windows 内部的各种结构通常都会由双向链表串起来,用 !list 命令查看这些结构非常方便. 比如查看系统中的所有进程: lkd> !list -t nt!_LIST_ENTRY.Flin ...