poj2352树状数组

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

Hint

This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.

题意:给你一串坐标,找左下方的星星数

题解:树状数组,x方向处理,因为是从y方向递增的

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007

using namespace std;

const double g=10.0,eps=1e-9;
const int N=15000+5,maxn=32000+5,inf=0x3f3f3f3f;

int s[maxn],num[maxn];

void add(int i,int x)
{
    while(i<=maxn){
        s[i]+=x;
        i+=i&(-i);
    }
}
int sum(int i)
{
    int ans=0;
    while(i>0){
        ans+=s[i];
        i-=i&(-i);
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
 //   cout<<setiosflags(ios::fixed)<<setprecision(2);
    int n,x,y;
    while(cin>>n){
        memset(num,0,sizeof num);
        memset(s,0,sizeof s);
        for(int i=1;i<=n;i++)
        {
            cin>>x>>y;
            int te=sum(x+1);
            num[te]++;
            add(x+1,1);
        }
        for(int i=0;i<n;i++)cout<<num[i]<<endl;
    }
    return 0;
}

时间: 2024-10-10 03:39:03

poj2352树状数组的相关文章

[ACM] POJ2352 [树状数组稍微变形]

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. As

POJ2352——树状数组——Stars

http://poj.org/problem?id=2352 模板 /************************************************ * Author :Powatr * Created Time :2015-8-13 16:18:10 * File Name :POJ2352stars.cpp ************************************************/ #include <cstdio> #include <al

POJ2352 Stars 树状数组

POJ2352 非常裸的树状数组的题. 注意数组下标不能从0开始 因为lowbit(0)==0 所以 所有横坐标统一加1 数组要开的够大 就酱 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> using namespace std; const int maxn=15000,

POJ2352 Stars 【树状数组】or【线段树】

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31172   Accepted: 13595 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 st

POJ2352题解(树状数组)

POJ2352题解(树状数组) 2019-12-29 Powered by Gauss 1.题目传送门:POJ2352 2.题目大意: 这是一道非常经典的树状数组的模板题. 题目大意是说,给出N颗星星,每个星星都有一个二维坐标,要求出位于每颗星星左下方的星星的数量. 3.算法思路: 这道题被给出之后立刻想到暴力法,让我们来计算一下: 根据题目,N<=15000,暴力法需要双层循环,也就是150002=225,000,000,超出了一秒,所以不得不寻求更快更好的算法思想. 当我们需要求查询,求和的

poj--2352 Stars(树状数组)

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. As

树状数组POJ2352星星

http://poj.org/problem?id=2352 这道题的题意对于住学者应该比较难理解,但是如果弄明白他的意思的话,你就会发现这就是赤裸裸的树状数组,哎,欺负我不懂是吧,当时读题读啦好久,好啦,下面说一下他的意思吧.. 由于题目已经说明y的坐标是递增顺序,所以直接考虑x的坐标就可以啦.每次当有x输入时,都求出sum(x+1)的值(注意呦,在树状数组中,可是从1开始的,而题目中的输入是包含0的),并把result[sum(x+1)]++:再更新一下,就好啦啦啦啦. 还是要注意一点,用c

POJ2352(树状数组)

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33786   Accepted: 14741 题目链接:http://poj.org/problem?id=2352 Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesia

poj2352 starts 树状数组

有n个星星,按照y坐标的升序给出n个星星的坐标, 对于每一个星星,其level为在其左下方(包括正左,正下)的星星个数,输出n行,第i行代表等级为i个星星的星星的个数. 树状数组的插点问段 思路: a[i] 存储星星的x坐标, b[i] 表示0到i中x,y坐标小于i的个数,即i的等级 则对于每个b[i], 做一次扫描 ans[i] 表示等级为i的个数 则ans[b[i]]++; 明显,这样肯定tle. 所以要采用树状数组 . a[i] 表示目前的星星中x坐标为i的个数 c[i] 为a[i]的树状