#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 15010, M = 32010;
int n; // 星星的数目
int tr[M], level[N]; // tr数组用于存储树状数组,level数组用于存储每个等级的星星数目
int lowbit(int x) // 获取x的最低位的1
{
return x & -x;
}
int query(int x) // 查询前x个位置的和
{
int res = 0;
for (int i = x; i; i -= lowbit(i))
res += tr[i];
return res;
}
void add(int x, int v) // 将v加到第x个位置
{
for (int i = x; i < M; i += lowbit(i))
tr[i] += v;
}
int main()
{
scanf("%d", &n); // 输入星星的数目
for (int i = 0; i < n; i ++ )
{
int x, y;
scanf("%d%d", &x, &y); // 输入星星的坐标
x ++ ; // 坐标从1开始,所以需要加1,为了防止出现0的情况,给它全体横坐标加上 1 就好了。
int t = query(x); // 查询前x个位置的和,即左下方的星星数目
level[t] ++ ; // 对应等级的星星数目加1
add(x, 1); // 将1加到第x个位置
}
for (int i = 0; i < n; i ++ )
printf("%d\n", level[i]); // 输出每个等级的星星数目
return 0;
}
AcWing 1265. 数星星 树状数组
于 2024-03-27 10:59:59 首次发布