题意
有n颗星星,给出每颗星星的坐标,输入时按y坐标递增,y坐标相等时,按x坐标递增。求每颗星星左下方的星星数并输出
解法
由于输入时y坐标是不降序的, 所以我们每次读入的时候用树状数组统计X坐标比小于等于X的星星有多少个就可以了,不过,当x为0时会死循环,所以在读入x后应加1。
不会树状数组的话
P3374 【模板】树状数组 1
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 32000 + 1000;
int n, a[maxn], ans[maxn];
int _lowbit(int x) {
return x & -x;
}
void update(int x, int k) {
while(x <= 32005) {
a[x] += k;
x += _lowbit(x);
}
}
int sum(int x) {
int total = 0;
while(x > 0) {
total += a[x];
x -= x&(-x);
}
return total;
}
int main() {
int x, y;
while(scanf("%d", &n) != EOF) {
memset(a, 0, sizeof(a));
memset(ans, 0, sizeof(ans));
for(int i=0; i<n; i++) {
scanf("%d%d", &x, &y);
x++;
ans[sum(x)]++;
update(x, 1);
}
for(int i=0; i<n; i++) {
printf("%d\n", ans[i]);
}
}
return 0;
}