给你星星的坐标(y递增,若y相等,x递增),每个星星都有一个等级,规定它的等级就是在它左下方的星星的个数。输入所有星星后,依次输出等级为0到n-1的星星的个数。
思路
统计某个星星左下角有多少星星。
本题给出的数据已经按照y从小到大排好了,所以我们只需要考虑x就行,题意也就成了统计某个星星前面有多少星星。使用树状数组需要注意:给的点的坐标是从0开始的,树状数组中x不能为0,所以我们需要在输入x坐标时加一。
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=32005;
int ans[maxn],c[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int val)// Add操作,将第i个元素增加val,那么他的父节点也要增加+
{
while(i<=maxn)
{
c[i]+=val;
i+=lowbit(i);//i的父节点
}
}
int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
int main()
{
int i,j,n;
scanf("%d",&n);
int x,y;
for (i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
x++;
ans[sum(x)]++;//sum算出x的级别,然后ans计数
add(x,1);
}
for (i=0; i<n; i++)//级别从0->n-1的行星数量
printf("%d
",ans[i]);
return 0;
}