(星星)又是一道洛古上没有的题(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可以更快一些,可以节约一些时间