知识点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)$. 块 ...
随机推荐
- 通过phoenix创建hbase表失败,创建语句卡住,hbase-hmaster报错:exception=org.apache.hadoop.hbase.TableExistsException: SYNC_BUSINESS_INFO_BYDAY_EFFECT
问题描述: 前几天一个同事来说,通过phoenix创建表失败了,一直报表存在的错误,删除也报错,然后就针对这个问题找下解决方案. 问题分析: 1.通过phoenix创建表,一直卡住不动了.创建语句如下 ...
- C#的字符串优化-String.Intern、IsInterned
https://www.jianshu.com/p/af6eb8d3d4bf 首先看一段程序: using System; class Program { static void Main(strin ...
- cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制
一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...
- C# Distinct使用,支持对象的相等比较
官网Enumerable.Distinct https://msdn.microsoft.com/zh-cn/library/bb338049.aspx CSDN中作者oriency755 关于Dis ...
- 【IOS6.0 自学瞎折腾】(四)Xib可视化编程
其实在Interface Builder中,要把xib中的控件与代码联系起来用鼠标拖拉连线是非常方便的一件事,有的教程写的非常复杂要先点这后点那的. 一:IBOutlet,IB说明是Interface ...
- AndroidのListView之滑动列表项(点击事件和滑动事件共存)
这里正好在项目有这么一个bt的需求,如下图ListView的item可以响应点击事件也可以响应item的左右滑动事件,两个事件可以相互独立互不影响. 听说iphone的list选项就有这样bt的功能, ...
- OpenLayers基础知识:
OpenLayers是一个开源的js框架,用于在您的浏览器中实现地图浏览的效果和基本的zoom,pan等功能.OpenLayers支持的地图来源 包括了WMS,GoogleMap,KaMap,MSV ...
- css 分栏高度自动相等
方法2: <div class="ticket_table"> <div class="ticket_l"> <h3>全票& ...
- fabric入门
author: headsen chen date: 2018-08-12 23:13:16 1,安装 yum -y install epel-releaseyum -y install fabr ...
- 二维坐标系极角排序的应用(POJ1696)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3170 Accepted: 2029 Descrip ...