poj 2352 入门树状数组

来源:互联网 发布:淘宝网天猫孕妇装 编辑:程序博客网 时间:2024/06/07 01:40

点击打开链接


Stars
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 49310 Accepted: 21282

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

51 15 17 13 35 5

Sample Output

12110
题意: 按照y的升序给出星星的坐标,一个星星如果有a个星星的x和y均小于或等于这个星星的坐标,那么这个星星的等级就是a,
依次求等级为0到n-1的星星个数
由于数据是按照y升序给出的,因此计算的时候可以完全不管y,只对x进行研究,求某个星星等级时,只需计算已经给出的星星坐标中有几个星星的x是小于这个星星的x就行了,可用树状数组进行维护和计算。
#include<stdio.h>#include<string.h>int num[50000];int vis[20000];int sum(int i){int ans=0;while(i>0){ans+=num[i];i-=i&(-i); }return ans;}void add(int i,int n){while(i<=n){num[i]++;i+=i&(-i);}}int main(){int n;while(~scanf("%d",&n)){int x,y,i;memset(vis,0,sizeof(vis));memset(num,0,sizeof(num));for(i=0;i<n;i++){scanf("%d%d",&x,&y);x++;  //记得要加1,因为给出的数据有0,对0计算会死循环 vis[sum(x)]++;add(x,40000);}for(i=0;i<n;i++)printf("%d\n",vis[i]);}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2年级下册数学应用题 七年级上数学应用题 三年级上册数学应用题 二年级下册数学应用题 四年级上册数学应用题 四年级上册数学应用题100道 五年级上册数学应用题 小学二年级数学应用题 二年级数学下册应用题大全 三年级下册数学应用题 小学六年级数学应用题 六年级下册数学应用题 七年级上册数学应用题 四年级鸡兔同笼应用题 五年级小数除法应用题 五年级下册数学应用题 三年级上期数学应用题 小学三年级时间应用题 小学二年级数学应用题大全 小学三年级数学应用题上册 六年级工程问题应用题 六年级数学比例应用题 六年级数学工程应用题 五年级鸡兔同笼应用题 10以内的加减法应用题 五年级上册小数除法应用题 小学二年级数学应用题上册 小学三年级上册数学应用题 二年级数学除法应用题 小学二年级除法应用题 二年级下册奥数应用题 七年级数学方程应用题 五年级数学方程应用题 小学数学四年级应用题 小学四年级上册数学应用题 六年级数学方程应用题 二年级上学期数学应用题 小学五年级上册应用题 五年级列方程解应用题 六年级数学分数乘法应用题 三年级上学期数学应用题