分析
一道树状数组,但坑点比较多。。。
首先在草稿纸上画图可以得知:星星的等级与(x)无关,至于(y)的大小有关,于是我们可以根据输入顺序一一将其插入树状数组进行维护,此星星的等级其实就是在插入前以(1)~星星的(y)的星星数量和。
注意
星星的坐标是从((0, 0))开始存,但树状数组不能够维护,所以要提前将所有星星的(x)加上一。(如果在求和函数中把限度跳到0就会卡死循环我就错了)
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 3e5 + 5;
int x[MAXN], n, m, star[MAXN], t[MAXN];
int bit[MAXN];
int lowbit(int x) {
return x & (-x);
}
void update(int k, int x) {
for (int i = k; i <= MAXN; i += lowbit(i)) {
bit[i] += x;
}
}
int Sum(int k) {
int ans = 0;
for (int i = k; i; i -= lowbit(i)) {
ans += bit[i];
}
return ans;
}
int main() {
// freopen("star.in", "r", stdin);
// freopen("star.out", "w", stdout);
scanf ("%d", &n);
for (int i = 1, y; i <= n; i++) {
scanf ("%d %d", &x[i], &y);
++x[i];
m = max(m, x[i]);
}
for (int i = 1; i <= n; i++) {
star[Sum(x[i])] ++;
update(x[i], 1);
}
for (int i = 0; i < n; i++) {
printf ("%d
", star[i]);
}
return 0;
}