题目链接
分析
一道树状数组,但坑点比较多。。。
首先在草稿纸上画图可以得知:星星的等级与$x$无关,至于$y$的大小有关,于是我们可以根据输入顺序一一将其插入树状数组进行维护,此星星的等级其实就是在插入前以$1$~星星的$y$的星星数量和。
注意
星星的坐标是从$(0, 0)$开始存,但树状数组不能够维护,所以要提前将所有星星的$x$加上一。(如果在求和函数中把限度跳到0就会卡死循环我就错了)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #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() {
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\n", star[i]); } return 0; }
|