poj2352 Stars

来源:互联网 发布:美工网 编辑:程序博客网 时间:2024/04/20 10:21

http://poj.org/problem?id=2352

解法:树状数组,因为空间是32000的,不是很大,可以不离散化,这样写起来容易很多。代码如下:

#include<iostream>using namespace std;#define MAXN 32001int c[MAXN],num[MAXN];int lowbit(int x){return x&(x^(x-1));}void add(int t,int num){while(t <= MAXN){c[t] += num;t += lowbit(t);}}int getSum(int t){int sum = 0;while(t > 0){sum += c[t];t -= lowbit(t);}return sum;}int main(){int x,y,N;scanf("%d",&N);memset(c,0,sizeof(c));memset(num,0,sizeof(num));for(int i = 1;i<=N;i++){scanf("%d%d",&x,&y);x++;num[getSum(x)]++;add(x,1);}//按y排好序的,y相同时按x排好序//对每个输入只要求出前面x比自己小的即可for(int i = 0;i<N;i++)printf("%d\n",num[i]);return 0;}

141 ms.