知识点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)$. 块 ...
随机推荐
- C++ 对象间的赋值与拷贝构造函数
1.对象间的赋值 /***A.h文件***/ #pragma once class A { public: int va; A(void); A(char* name); A(const A& ...
- NHibernate初学二之简单执行SQL及HQL、Linq
上篇文章简单介绍NHibernate之简单增删改查,本文将会简单介绍有关执行NHibernate的SQL.HQL及存储过程: 一:执行SQL语句实例,运用CreateSQLQuery方法 public ...
- swift - 之 UIColor使用自定义的RGB配色
1.10进制颜色 UIColor(red: /, green: /, blue: /, alpha: 0.5) 2.16进制颜色 UIColor(red: , green: , blue: , alp ...
- Apache Prefork、Worker和Event三種MPM分析
三種MPM介紹 Apache 2.X 支持插入式並行處理模塊,稱爲多路處理模塊(MPM).在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到 ...
- shell基础篇(九)函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用1. Shell 函数的定义格式如下: ...
- Linux mii-tool 命令
mii-tool 用来查看或设置网卡的相关参数,该命令已经过时了,推荐使用 ethtool 命令 [root@localhost ~]$ mii-tool -v eth1 # 查看网卡的相关信息,包括 ...
- Android使用百度定位API时获取的地址信息为null
option.setAddrType("all"); //加上这个配置后才可以取到详细地址信息
- ATL字符宏使用以及代码测试
// ATL_Convert.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #incl ...
- Windows Phone 上拉刷新、下拉刷新
ScrollViewer scrollViewer = new ScrollViewer(); // 构造函数 public MainPage() { InitializeComponent(); ; ...
- 最小树形图(hdu4966多校联赛9)
GGS-DDU Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...