POJ 2352
---恢复内容开始---
http://poj.org/problem?id=2352
这是一个树状数组的题目,也是我第一次接触这类的题目,也正是因为之前的一道题,TLE了,超时太严重了,我看discuss里再说什么用树状数组可以我才去找有关于这方面的博客看
看了很多博客才稍微的理解了一点树状数组,可以在以后的做题中,加强对这个的理解

这个图片就是数组数组的内涵所在
其中A数组就是原数组,而C[n]=a[n-2^k+1]+.......+a[n]的值,其中K为二进制下的末尾0的个数,比如c[8],8(1000)有3个0,所以,k=3,则C[8]就表示从a[1]到a[8]的值;
int lowbit(int x)
{
return x&(-x); //这个就是用来返回2^k的值的。
}
而对于查询来说的话
求(1,8)的值就是为C[8]
而求(4,8)的值时则可以用C[8]-c[3]-c[2];
也就是sum(a,b)=sum(1,b)-sum(1,a-1);
int sum(int end) //计算原数组1-end的和
{
int sum=;
while(end>)
{
sum+=c[end];
end-=lowbit(end);
}
return sum;
}
关于上面的第6-7行,我觉得举两个实例更加容易理解
比如说要求1-8的和也就是c[8];
首先end=8;
也就是sum=c[8];
而lowbit=8,所以,sum=c[8];
而当end=7;时
首先sum=c[7];
而7(111)所以C[7]=a[7];
lowbit(7)=1;
所以接下来就是sum=c[7]+c[6];
6(110)所以,c[6]=a[5]+a[6];
end=4;
在接下来就是sum=c[7]+c[6]+c[4];
4(100)所以,c[4]=a[1]+....+a[4];
end=0;
不得不说,这个确实很巧妙
对于更新的话,这个只有一个点一个点的进行更新
下面为从a[pos]的位置上加一个num:
void update(int pow,int num)
{
while (pow<=n)
{
c[pow]+=num;
pow+=lowbit(pow);
}
}
其实有了上面的的举例之后,也可以感觉得到在某个位置上加个数之后,只不过是在被C包围的那个位置上加上个数,所对应的C也自然而然的加,
且这个有局限性就是只可以对于单个节点进行更新
对于二维数组数组
下面的代码给a[i][j]这一节点加上个K
void update(int i,int j,int k)
{
while (i<=n)
{
int temp=j;
while(temp<=n)
{
c[i][temp]+=k;
temp+=lowbit(temp);
}
i+=lowbit(i);
}
}
下面就是关于POJ2352的一个解题代码
#include <stdio.h>
#include <iostream> using namespace std; int n;
int level[]; //level就是用来存等级的
int c[]; //树状数组
int lowbit(int x)
{
return x&(-x);
} int sum(int x) //求和
{
int s=;
while(x>)
{
s+=c[x];
x-=lowbit(x);
}
return s;
} void update(int pos) //更新,因为树状数组么,所以它肯定是更新到最顶端!
{
while(pos<=)
{
c[pos]++;
pos+=lowbit(pos);
}
}
int main()
{
scanf("%d",&n);
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
level[sum(x+)]++; //每次多一个之后,sum(x+1)所对应的那个等级就会++,而为什么是X+1的目的就是避免X=0,而且不会影响其的相对位置,如果不理解,多看几遍就会懂其内涵
update(x+);
}
for(int i=;i<n;i++)
{
printf("%d\n",level[i]);
}
return ;
}
POJ 2352的更多相关文章
- poj 2352 Stars 数星星 详解
题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...
- POJ 2352 Stars(线段树)
题目地址:id=2352">POJ 2352 今天的周赛被虐了. . TAT..线段树太渣了..得好好补补了(尽管是从昨天才開始学的..不能算补...) 这题还是非常easy的..维护 ...
- POJ 2352 Stars(树状数组)
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30496 Accepted: 13316 Descripti ...
- POJ 2352 && HDU 1541 Stars (树状数组)
一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...
- 【树状数组】POJ 2352 Stars
/** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...
- POJ 2352 star level
题目链接: http://poj.org/problem?id=2352 题目大意:对于每一颗星星来说,都有一个属于自己的level,这个值为其他星星x,y坐标均不大于本星星的个数.输入时按先y由小到 ...
- 【POJ 2352】 Stars
[题目链接] http://poj.org/problem?id=2352 [算法] 树状数组 注意x坐标为0的情况 [代码] #include <algorithm> #include ...
- POJ 2352 Stars 线段树
题目链接 题意:在一个二维平面上有n个星星,每个星星的等级为x,x为该星星左方和下方所包含的星星的数量(包含正左和正下的),输出每个等级各有多少星星,星星坐标按照y序递增给出,y值相同按照x递增给出. ...
- POJ 2352 Stars 线段树 数星星
转载自 http://www.cnblogs.com/fenshen371/archive/2013/07/25/3214927.html 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标 ...
随机推荐
- inet_ntoa、 inet_aton、inet_addr
inet_addr() 简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...
- 15分钟学会使用Git和远程代码库
git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...
- [js/jquery]移动端手势拖动,放大,缩小预览图片
摘要 有这样的需求需要在手机端预览图片的时候,实现图片的手势拖动,放大缩小功能.最终通过touch.js这个插件实现了效果. touch.js Touch.js是移动设备上的手势识别与事件库, 由百度 ...
- PHP中spl_autoload_register()函数
spl_autoload_register — 注册给定的函数作为 __autoload 的实现 官方地址:http://php.net/manual/zh/function.spl-autoload ...
- hdu5024 Wang Xifeng's Little Plot (水
http://acm.hdu.edu.cn/showproblem.php?pid=5024 网络赛 Wang Xifeng's Little Plot Time Limit: 2000/1000 M ...
- C#创建windows服务列表
转载自:http://www.cnblogs.com/sorex/archive/2012/05/16/2502001.html Windows Service这一块并不复杂,但是注意事项太多了,网上 ...
- 工具介绍 - NimbleText
非常实用的工具, 即使不是程序员也有必要掌握这个简单的小工具. 这个工具有桌面版和在线版两个版本. 桌面版地址: http://nimbletext.com/ 在线版地址: http://nimble ...
- Git基本常用命令
Git基本常用命令如下: mkdir: XX (创建一个空目录 XX指目录名) pwd: 显示当前目录的路径. git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件. git ...
- 升级xcode7.0 第三方库不能用的解决方法(bitcode是什么鬼?)
升级完xcode,真机运行发现报错,第三方库错误,微信SDK,高德SDK都报错,如下: ‘/Users/**/Framework/SDKs/PolymerPay/Library/mobStat/lib ...
- UIView不接受触摸事件的三种情况
1.不接收用户交互 userInteractionEnabled = NO 2.隐藏 hidden = YES 3.透明 alpha = 0.0 ~ 0.01 4. 如果子视图的位置超出了父视图的有效 ...