星星之火OIer:星星题解

(星星)又是一道洛古上没有的题(3763)

题目大意

天文学家经常研究星形图,其中恒星由平面上的点表示,每颗恒星都有笛卡尔坐标。让恒星的水平为不高于恒星的数量,而不是给定恒星的右侧。天文学家想知道恒星水平的分布。

例如,查看上图中显示的地图。星号5的等级等于3(它由三颗恒星形成,数字为1,2和4)。并且由2和4编号的星的等级是1.在该地图上,只有0级的一颗恒星,1级的2颗恒星,2级的一颗恒星和3级的一颗恒星。 

您将编写一个程序,用于计算给定地图上每个级别的星星数量。

 

输入

输入文件的第一行包含许多星号N(1 <= N <= 15000)。以下N行描述了恒星的坐标(每行由空格分隔的两个整数X和Y,0 <= X,Y <= 32000)。飞机的一个点上只能有一颗恒星。星号按Y坐标的升序列出。具有相等Y坐标的星以X坐标的升序列出。

 

输出

输出应包含N行,每行一个数字。第一行包含等级0的恒星数量,第二行包含等级1的恒星数量,依此类推,最后一行包含等级N-1的恒星数量。

 

这道题是一道树状数组的题,但是我暴搜A了,所以要发出来纪念一下  :-)

还是先上代码:

#include<cstdio>
inline void read(int &x) {
    x=0;char s=getchar();
    for(;s<'0'||s>'9';s=getchar());
    for(;s>='0'&&s<='9';x=x*10+s-48,s=getchar());
}
inline void pr(int x) {
    if(x>9)pr(x/10);
    putchar(x%10+48);
}
struct node {
    int x,y,sum;
}a[15005];
int i,n,j,k,s[15005];
int main() {
    read(n);
    for(i=1;i<=n;i++) {
        read(a[i].x),read(a[i].y);
        for(j=1;j<i;j++)
            if(a[i].x>=a[j].x&&a[i].y>=a[j].y)
                a[i].sum++;
        s[a[i].sum]++;
    }
    for(i=0;i<n;i++)
        pr(s[i]),putchar('\n');
}

代码很好懂,然后这道题就用了560ms左右。。。。。。

然后就是应该用vector可以更快一些,可以节约一些时间

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值