hdu1541树状数组模板

题意:星星的等级计算方法是看它左下方星星的数目来定的。根据y坐标递增(若y坐标相等则x坐标递增)的顺序给出一堆星星的坐标,请计算所有等级(n-1个等级)的星星数。

解题思路:由于是按一定顺序给出星星,那么我们读进的星星不会有前者等级大于后者的情况出现。情况只有两种:①前者在后者的左下方;②前者不在后者的左下方。
每一次读进星星我们只能靠x来判断是属于那种情况,所以如果有一个表可以记录横坐标为
0--x的星星数目的话,这个题目就相当简单了,而这个表就是树状数组。
31msC++代码

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int NUM = 40000<<2;
int cc[ NUM ];
int nn;
int lowbit(int i)//寻找过程?
{
return i&(-i);
}
void update(int i,int num)//更新,把1--i的所有值都加上
//mun!!
{
while(i>0 && i<=NUM)//将0的情况完全排除,其中nn是记录的数据的上限
{
cc[i]=cc[i]+num;//其中cc是上传记录的数组
i=i+lowbit(i);
}
}
int sum(int i)//查询1--i的和?
{
int t=0;
while(i>0&& i<=NUM)
{
t=t+cc[i];
i=i-lowbit(i);
}
return t;
}
int ans[40000];
void init()
{
memset(cc, 0, sizeof(cc));
memset(ans,0, sizeof(ans));
}
int main()
{
int i,j,x,y;
while(scanf("%d",&nn)!=EOF)
{
init();
for(i = 0; i<nn ;i++)
{
scanf("%d %d",&x,&y);
ans[sum(x+1)]++;
update(x+1,1);
}
for(i = 0; i<nn ;i++)
printf("%d\n",ans[ i ]);
}
return 0;
}

 

你可能感兴趣的:(记录,include,计算方法)