hdu 1541/poj 2352:Stars(树状数组,经典题)

Stars


Time Limit: 2000/1000 MS
(Java/Others)    Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 4052    Accepted
Submission(s): 1592

Problem 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

Source

Ural
Collegiate Programming Contest 1999

Recommend

LL   |   We have
carefully selected several similar problems for you:  1166 1394 3450 1542 1255 


  树状数组,经典题

  这道题里,树状数组的作用是记录到某x坐标的所有星星的数目,这个数目就是该星星的等级,然后把level[]数组对应的等级计数+1。最后输出level数组即可。

  树状数组模板


int lowbit(int x)
{
return x & -x;
}
int sum(int a[],int x) //求出第x个元素之前的和
{
int ans = 0;
while(x>0){
ans+=a[x];
x -= lowbit(x); //向左上爬
}
return ans;
}
void add(int a[],int x,int d,int n) //将编号为x的数加d
{
while(x<=n){
a[x]+=d;
x+=lowbit(x);
}
}

  代码:


 1 #include <stdio.h>
2 #include <iostream>
3 using namespace std;
4 int lowbit(int x)
5 {
6 return x & -x;
7 }
8 int sum(int a[],int x) //求出第x个元素之前的和
9 {
10 int ans = 0;
11 while(x>0){
12 ans+=a[x];
13 x -= lowbit(x); //向左上爬
14 }
15 return ans;
16 }
17 void add(int a[],int x,int d,int n) //将编号为x的数加d
18 {
19 while(x<=n){
20 a[x]+=d;
21 x+=lowbit(x);
22 }
23 }
24 int main()
25 {
26 int i,n;
27 while(scanf("%d",&n)!=EOF){
28 int level[15010]={0};
29 int x[32010]={0};
30 for(i=1;i<=n;i++){ //输入,计算当前星星前面的总星数(level),对应等级值+1,更新x[]数组
31 int a,b,num=0;
32 scanf("%d%d",&a,&b);
33 level[sum(x,a+1)]++;
34 add(x,a+1,1,32010); //这个位置的星星数+1
35 }
36 for(i=0;i<n;i++) //输出
37 printf("%d\n",level[i]);
38 }
39 return 0;
40 }

Freecode : www.cnblogs.com/yym2013

hdu 1541/poj 2352:Stars(树状数组,经典题),布布扣,bubuko.com

时间: 2024-10-02 09:25:47

hdu 1541/poj 2352:Stars(树状数组,经典题)的相关文章

POJ 2481 Cows &amp;&amp; POJ 2352 Stars(树状数组妙用)

题目链接:POJ 2481 Cows POJ 2352 Stars 发现这两个题目都跟求逆序数有着异曲同工之妙,通过向树状数组中插入点的位置,赋值为1,或者++,然后通过求和来判断比当前 点 "小" 的有多少点. Cows需要自己排序, Stars题目已经给排好序. POJ 2352 Stars 题目大意为在二维坐标上给出一些星星的坐标,求某一个星星左方,下方,左下方的星星个数.题目已经把星星按照Y坐标从小到大,X从小到大排序.因此,在每次对一个星星进行统计时,之前出现过的星星,只要X

POJ 2352 Stars(树状数组 or 线段树)

链接: http://poj.org/problem?id=2352 题目大意: 在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y.如果左下位置有a个星星,就表示这个星星属于level x 按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量. 思路: 由于输入的顺序,对于第i颗星星,它的等级是之前输入的星星中,横坐标x小于等于i星横坐标的那些星星的总数量(前面的y一定比后面的y小). 所以是查询+更新操作

hdu 1541 Stars 树状数组水题

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5210    Accepted Submission(s): 2053 Problem Description Astronomers often examine star maps where stars are represented by points on a pla

POJ 2352 【树状数组】

题意: 给了很多星星的坐标,星星的特征值是不比他自己本身高而且不在它右边的星星数. 给定的输入数据是按照y升序排序的,y相同的情况下按照x排列,x和y都是介于0和32000之间的整数.每个坐标最多有一个星星. 思路: 这题给的输入数据很祥和,间接提示思路了. 用x作为树状数组的区间,然后按照输入的顺序不断查找在包括自己的位置以及左边的星星数. 细节是x可能是0,这是树状数组不能接受的,需要对输入的x数据进行加一操作. 从这题可以看出树状数组最直白的作用就是求从1开始到某个点的某个区间的数量. #

hdu 1541 Stars 树状数组模板题

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int  maxn=15010; const int maxlen=32010; int tree[4*maxn]; int lowbit(int n) { return (n&-n); } int getsum(int i) { int sum=0; while(i>0) { sum+=tree

hdu1541 Stars 树状数组水题

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5378    Accepted Submission(s): 2125 Problem Description Astronomers often examine star maps where stars are represented by points on a pla

POJ 2481Cows(树状数组 + 好题)

Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15222   Accepted: 5070 Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in hi

POJ 2309 BST 树状数组基本操作

Description Consider an infinite full binary search tree (see the figure below), the numbers in the nodes are 1, 2, 3, .... In a subtree whose root node is X, we can get the minimum number in this subtree by repeating going down the left node until t

hdu 3015 Disharmony Trees (离散化+树状数组)

Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 663    Accepted Submission(s): 307 Problem Description One day Sophia finds a very big square. There are n trees in the square. T