今天早上郁闷了,有种被骗的感觉,wa了N次,看了别人的解题报告才知道,输入有多组数据。what?输入有多组数据,题目有说明么?

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.

明明一开始就input file contains a number of stars N.是不是我太笨了,还是题目表达的不好?

浮云浮云,还是切入正题吧。

又是一道稍显简单的树状数组,题目说给了你N个坐标,题目都帮你排好序了,所以自己不用排,果断把y坐标给忽略掉.直接比较x,比x小的就算进去,最后用另一数组count[]来计算level的数量。

不过一上来,数组就开错,runing error.鸭梨真的好大。

 

#include<stdio.h>  
#include<string.h>  
//#include<iostream>  
#define M 33000  
#define lowbit(x) x&(-x)  
  
struct C  
{  
 int x;  
 int y;  
}coord[M];  
  
int flag[M],count[M];  
  
//using namespace std;  
  
int add(int n)  
{  
 while(n<M)  
 {  
  flag[n]++;  
  n+=lowbit(n);  
 }  
 return 0;  
}  
  
int subsum(int n)  
{  
 int sum=0;  
 while(n>=1)  
 {  
  sum+=flag[n];  
  n-=lowbit(n);  
 }  
 return sum;  
}  
  
int main(void)  
{  
 int n,i;  
 while(scanf("%d",&n)==1)  
 {  
   
  memset(count,0,sizeof(count));  
  memset(flag,0,sizeof(flag));  
  for(i=1;i<=n;i++)  
   scanf("%d%d",&coord[i].x,&coord[i].y);  
  for(i=1;i<=n;i++)  
  {  
   // cout<<subsum(coord[i].x+1)<<"   ";  
   count[subsum(coord[i].x+1)]++;//不同level计数  
   add(coord[i].x+1);//这里的coord[i].x都要加1,因为树状数组总是从1开始计数,而坐标可以是0的  
  }  
  // cout<<endl;  
  for(i=0;i<n;i++)  
   printf("%d\n",count[i]);  
 }  
 return 0;  
}  
 

 

posted on 2011-04-24 11:24  cchun  阅读(145)  评论(0编辑  收藏  举报