Stars
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 43467 Accepted: 18915Description
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 5Sample Output
1
2
1
1
0Hint
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
树状数组的裸题,我不会树状数组QAQ
因为数据是有序的,读入的时候直接输出小于等于他的数就可以了,还有就是有可能有0,但我们不好处理,就+1就好了
然后下面是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<stack>
#define INF 2100000000
#define ll long long
#define clr(x) memset(x,0,sizeof(x))
#define clrmax(x) memset(x,127,sizeof(x))
using namespace std;
inline int read()
{
char c;
int ret=0;
while(!(c>='0'&&c<='9'))
c=getchar();
while(c>='0'&&c<='9')
{
ret=(c-'0')+(ret<<1)+(ret<<3);
c=getchar();
}
return ret;
}
#define M 32005
int tree[M],level[M];
void insert(int x)
{
while(x<=M)
{
tree[x]++;
x+=x&(-x);
}
}
int find(int x)
{
int ret=0;
for(int i=x;i;i-=i&(-i))
ret+=tree[i];
return ret;
}
int n;
int main()
{
freopen("in.txt","r",stdin);
n=read();
for(int i=1;i<=n;i++)
{
int x=read()+1,y=read();
level[find(x)]++;
insert(x);
}
for(int i=0;i<n;i++)
printf("%d\n",level[i]);
return 0;
}
大概就是这个样子,如果有什么问题,或错误,请在评论区提出,谢谢。