传送门:HDU 1541
题意
给定一组点,用坐标表示,求各个层次的点的数量, 每个点层次指的是其它点中x,y坐标均不大于当前点x,y坐标点的数量
题解:
注意题目给出, 所有输入对于y来说都是不降序, 所以只要考虑x就可以了, y不增的时候x自增, 所以后输入的点不会影响先输入点的层次
因为计算层次的时候要排除自身, 所以要先更新当前点的层次再更新树状数组
AC code:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define lowbit(x) (x & (-x))
#define LL long long
#define debug 0
const int maxn(500005);
int ans[15003], c[32003];
int n;
void add(int id, int v) {//更新树状数组
while (id <= 32000) {
c[id] += v;
id += lowbit(id);
}
}
int getSum(int id) {//当前点的层次
int res = 0;
while (id) {
res +=c[id];
id -= lowbit(id);
}
return res;
}
int main() {
#if debug
freopen("in.txt", "r", stdin);
#endif //debug
int x, y;
while (cin >> n) {
memset(c, 0, sizeof(c));
memset(ans, 0, sizeof(ans));
for (int i = 1; i <= n; ++i) {
cin >> x >> y;
++x;//lowbit 用0会TLE
ans[getSum(x)]++;
add(x, 1);
}
for (int i = 0; i < n; i++) {
cout << ans[i] << endl;
}
}
return 0;
}