アイデア:
タイトルの星はy座標の昇順で与えられ、同じy座標はx座標の昇順で与えられるため、各横軸xが対応する星の数を検討し、の接頭辞を見つけるだけで済みます。 0〜xそしてあなたは星の各レベルの番号コードを得ることができます
:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int N = 32010;
int n;
int level[N],tr[N];//tr[i]表示该横坐标下有多少个星星,level[]表示第i级星星的数目
int lowbit(int x)
{
return x & -x;
}
void add(int x)
{
for(int i = x;i < N;i += lowbit(i))
{
tr[i]++;//放入一个星星,则后续所有相关的数目都加一
}
}
int sum(int x)
{
int res = 0;
for(int i = x;i;i -= lowbit(i))
{
res += tr[i];
}
return res;
}
int main()
{
int x,y;
cin >> n;
for(int i = 1;i <= n;i++)
{
scanf("%d %d",&x,&y);
x++;//树状数组初始应该为1
level[sum(x)]++;//第x级星星的数量
add(x);//放入该星星
}
for(int i = 0;i < n;i++)
printf("%d\n",level[i]);
return 0;
}