poj 2352 stars

/*
大概题意,给一些星星的坐标,按y坐标升序给出,记每个星星左下(包括左和下)的星星数为该星的level,问每个level的星星的个数分别为多少?
*/

/*
Stars
Time Limit: 1000MS		Memory Limit: 65536K
Total Submissions: 28003		Accepted: 12255
Description

Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. Astronomers want to know the distribution of the levels of the stars. 


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

The first line of the input file contains a number of stars N (1<=N<=15000). The following N lines describe coordinates of stars (two integers X and Y per line separated by a space, 0<=X,Y<=32000). There can be only one star at one point of the plane. Stars are listed in ascending order of Y coordinate. Stars with equal Y coordinates are listed in ascending order of X coordinate. 
Output

The output should contain N lines, one number per line. The first line contains amount of stars of the level 0, the second does amount of stars of the level 1 and so on, the last line contains amount of stars of the level N-1.
Sample Input

5
1 1
5 1
7 1
3 3
5 5
Sample Output

1
2
1
1
0
Hint

This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.
Source

Ural Collegiate Programming Contest 1999
*/
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;

int c[32010] = {0};
int level[32010] = {0};
int n = 0;
//以下为树状数组的主要函数
int lowbit(int x)//从x的最右的1开始的数
{
	return x & (-x);
}

int sum_(int k)//前k项和
{
	int ret = 0;
	while (k)
	{
		ret += c[k];
		k -= lowbit(k);
	}
	return ret;
} 

void change(int k, int delta)//修改第k项为delta,并维护树状数组
{
	while (k < 32010)
	{
		c[k] += delta;
		k += lowbit(k);
	}
	return;
}
//以上为树状数组主要函数

int main()
{
	int x_ = 0, y_ = 0;
	memset(c, 0, sizeof(c));
	memset(level, 0, sizeof(level));
	scanf("%d", &n);
	for (int i = 0; i < n; ++i)
	{
		scanf("%d%d", &x_, &y_);//y是按升序输入的,其实可以直接无视掉y
		++x_;
		++level[sum_(x_)];
		change(x_, 1);
	}
	for (int i = 0; i < n; ++i)
		printf("%d\n", level[i]);
	return 0;
}

你可能感兴趣的:(poj)