如题:http://poj.org/problem?id=2352
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 34943 | Accepted: 15175 |
Description
![](https://i-blog.csdnimg.cn/blog_migrate/fd47938575a43734c7155490c64a749e.jpeg)
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
Source
题目大意:有很多星星,星星的等级是星星左下所有星星的和,求各个等级星星有多少个。
思路:C【】是个树状数组,记录的是x坐标前包含x的星星的个数。每一个x,y更新树状数组,level[sum(x)-1]++.x从0开始,所有x处理时+1.
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define n 32005
int N;
int c[n];
int level15005];
int lowbit(int x)
{
return x&(x^(x-1));
}
void add(int x,int num)
{
while(x<=n)
{
c[x]+=num;
x+=lowbit(x);
}
}
int sum(int x)
{
int s=0;
while(x>0)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
freopen("C:\\1.txt","r",stdin);
cin>>N;
int i;
for(i=0;i<N;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x+=1;
add(x,1);
level[sum(x)-1]++;
}
for(i=0;i<N;i++)
printf("%d\n",level[i]);
}