POJ - 2352Stars———线段树+二维偏序

Description:

天文学家经常研究星图,星图上的星星由平面上的点表示,每颗星星都有笛卡尔坐标。一颗星星的等级是指该星星左方至下方范围内的星星的数量.
例如,查看上图所示的地图,5号星的等级为3(左方至下方范围内有1、2、4号星),2号星和4号星的等级为1。在这张地图上有一颗0级的星星,两颗1级的星星,一颗2级的星星,和一颗3级的星星。 你需要写一个程序来计算给定星图上每个等级的星星数量。
在这里插入图片描述

Input:

输入的第一行包括了星星的数量N (1<=N<=15000),下面N行描述了每颗星星的坐标(每一行由一个空格分隔两个整数X和Y组成,
0<=X,Y<=32000)。每一个点只会存在一颗星星。星星以Y坐标的升序排列。Y坐标相等的恒星按X坐标的升序排列。

Ouput:

输出应该包括N行,每行一个数字。第一行为等级是0级的星星数量,第二行为等级是1级的星星数量,以此类推,最后一行为等级是N-1级的星星数量。

样例输入:

5
1 1
5 1
7 1
3 3
5 5

样例输出:

1
2
1
1
0

思路:
所谓星级就是小于或等于给定的星星的横坐标以及纵坐标的星星的数量,
之所以称之为二维偏序,也就是说,有两个维度,按照这两个维度来排序。
步骤,
①先按照一个维度来排序,比如先按点的y坐标来排序(不过题给输入就是按y的升序来排序的,也就无需我们自己再排序了),统计某个点的”星级“时,只要计算前面的出现的点的x坐标小于这个点坐标的个数。

1 1 1 3 5
1 5 7 3 5
用线段树来维护点的 x 坐标本身的信息,出现过,次数+1;
比如横坐标5出现了两次,a[5]=2;

③统计某个点的”星级“时,只要计算前面的出现的点的x坐标小于这个点坐标的个数。比如说第三点,它的横坐标是7,只需要统计区间[0,7]的和即可;
注意(5,5)并不会计入,因为我们只统计第三个点前面的点。

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxN = 32010;
int n;
struct Node{
    int l,r,sum;
}t[4*maxN];
void build(int p,int l,int r){
    t[p].l=l;t[p].r=r;
    if(l==r){
        t[p].sum=0;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1, mid+1, r);

}
void change(int p,int x){
    if(t[p].l==t[p].r){
        t[p].sum++;
        return;
    }
    int mid = (t[p].l+t[p].r)/2;
    if(x<=mid) change(p*2, x);
    else change(p*2+1,x);
    t[p].sum = t[p*2].sum+t[p*2+1].sum;  //不要忘记
}
int ask(int p,int l,int r){
    if(l<=t[p].l&&r>=t[p].r) return t[p].sum;
    int mid = (t[p].l+t[p].r)/2;
    int res=0;
    if(l<=mid) res+=ask(p*2, l, r);
    if(r>mid) res+=ask(p*2+1, l, r);
    return res;
}
int main(){
    while(~scanf("%d",&n)){
        build(1, 0, 32000);
        int x,y,res[n+2];
        memset(res, 0, sizeof(res));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            change(1, x);
            res[ask(1, 0, x)-1]++;  //自己不算,所以减1
        }
        for(int i=0;i<=n-1;i++) printf("%d\n",res[i]);
    }
    return 0;
}

发布了67 篇原创文章 · 获赞 0 · 访问量 1484

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/104630455
今日推荐