查看文章
 
poj 2352-Stars
2010-02-03 18:42

       网上说的很简单的一道树状数组题,昨天学了下树状数组,也确实觉得简单,但是不知道wa了几次,归根结底是没有理解了树状数组统计是从0开始的,而坐标的起点值是0,所有必须让开始变为1,然后再来对树状数组更新。

       最初看的时候没有想法主要是局限于对树的概念,树状数组不需要有什么节点,而是以区间来运算的,像这题里边:因为数据输入的时候按升序输入,那么后面的点必然不会为前面的星星加等级,而且后面的星星必然不在前面的之下,所以统计1到x+1之间有多少个星星,即是星星的级别。

code:

#include<iostream>
#include<stdio.h>
using namespace std;
int res[16000],c[33000],n;
int lowbit(int k)
{
return k&(-k);
}
int sum(int k)
{
int t=0;
while(k>0)
{
   t+=c[k];
   k-=lowbit(k);
}
return t;
}
void change(int k)
{
while(k<=32001)
{
   c[k]++;
   k+=lowbit(k);
}
}
int main()
{
int x,y,i;
scanf("%d",&n);
for(i=0;i<n;++i)
{
   scanf("%d %d",&x,&y);
   res[sum(x+1)]++;
   change(x+1);
}
for(i=0;i<n;++i)
   printf("%d\n",res[i]);
return 0;
}


类别:poj 树状数组||添加到搜藏 |分享到i贴吧|浏览(174)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu