/**
* 树状数组(入门):
* 3次TLE,一直弄不懂原因,还是看discuss,因为依题X取值是[0, 32000] 可能取0
* 所以当x等于0的时候,lowbit(0) 就超时了。 所以把所有输入的横坐标+1就行了
* 为什么是单单横坐标呢? 因为依题已规定y是递增输入。所以一维的树状数组记录横坐标即可。
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#define INF 0x7fffffff
#define MAXS 33000
#define LL long long
using namespace std;
int c[MAXS], level[MAXS], num[MAXS];
int n, maxn;
void init() {
memset(c, 0, sizeof(c));
memset(level, 0, sizeof(level));
}
int lowbit(int x) {
return x & (-x);
}
int get_sum(int x) {
int ret = 0;
for(int i = x; i >= 1; i -= lowbit(i)) {
ret += c[i];
}
return ret;
}
void update(int x) {
for(int i = x; i <= maxn; i += lowbit(i)) {
c[i] ++;
}
}
void print() {
for(int i = 0; i < n; i ++) {
printf("%d\n", level[i]);
}
}
int main()
{
while(scanf("%d", &n) != EOF) {
int y;
maxn = 0;
init();
for(int i = 0; i < n; i ++) {
scanf("%d%d", &num[i], &y);
num[i] ++;
if(num[i] > maxn) maxn = num[i];
}
for(int i = 0; i < n; i ++) {
level[get_sum(num[i])] ++;
update(num[i]);
}
print();
}
return 0;
}
POJ 2352 Stars 树状数组(入门)
最新推荐文章于 2018-09-14 09:21:40 发布