标签:
POJ2352数星星(stars)
【题目描述】:
天文学家经常观察星象图。星象图中用平面上的点来表示一颗星星,每一颗星星都有一个笛卡尔坐标。设定星星的等级为其左下角星星的总数。天文学家们想知道星星等级的分布情况。
比如上图,5号星星的等级为3(其左下角有编号为1、2、4的星星共三颗)。2号星星和4号星星的等级为1。在上图中只有一颗星星等级为0,两颗星星等级为1,一颗星星等级为2,一颗星星等级为3。
给定一个星象图,请你写一个程序计算各个等级的星星数目。
【输入描述】:
输入的第一行包含星星的总数N (1<=N<=15000)。接下来N行,描述星星的坐标(X,Y)(X和Y用空格分开,0<=X,Y<=32000)。星象图中的每个点处最多只有一颗星星。所有星星按Y坐标升序排列。Y坐标相等的星星按X坐标升序排列。
【输出描述】:
输出包含N行,每行一个整数。第一行包含等级0的星星数目,第二行包含等级1的星星数目,依此类推,最后一行包含等级为N-1的星星数目。
【样例输入】 |
【样例输出】 |
5 1 1 5 1 7 1 3 3 5 5 |
1 2 1 1 0 |
【数据范围及描述】:
此题一看以为是一道暴搜,但是暴搜会超时,思考了很长时间才发现一个很重要的条件没看到=_= 输入是按y轴升序输入的,也就是说后面的星星不可能被前面的星星包含,只需要考虑x轴。这样就把二维压成了一维,后面可以用树状数组解决。注意:x可能为0,但是树状数组是从1开始的所以每次操作时将x++;
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdlib> 5 #include <queue> 6 #include <stack> 7 #include <vector> 8 #include <iostream> 9 #include "algorithm" 10 using namespace std; 11 typedef long long LL; 12 const int MAX=32005; 13 int n; 14 int c[MAX],ans[MAX]; 15 void update(int x,int y){ 16 for (;x<MAX;c[x]+=y,x+=(x&-x)); 17 } 18 int search(int x){ 19 int re; 20 for (re=0;x>0;re+=c[x],x-=(x&-x)); 21 return re; 22 } 23 int main(){ 24 freopen ("stars.in","r",stdin); 25 freopen ("stars.out","w",stdout); 26 int i,j,k; 27 int x,y; 28 scanf("%d",&n); 29 memset(c,0,sizeof(c)); 30 memset(ans,0,sizeof(ans)); 31 for (i=1;i<=n;i++) 32 {scanf("%d%d",&x,&y); 33 x++; 34 j=search(x); 35 ans[j]++; 36 update(x,1); 37 } 38 for (i=0;i<n;i++) 39 printf("%d\n",ans[i]); 40 return 0; 41 }
标签:
原文地址:http://www.cnblogs.com/Michaelzzn/p/5722338.html