poj 2481
树状数组 与star类似
/************************************************************************* > Author: xlc2845 > Mail: xlc2845@gmail.com > Created Time: 2013年11月10日 星期日 15时35分23秒 ************************************************************************/ #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <queue> #include <stack> #include <set> #include <cstdlib> #define N 100009 #define M 1000000007 using namespace std; struct Node { int x, y, z; bool operator < (const Node& p) const { if(y != p.y) return y > p.y; return x < p.x; } }; Node cow[N]; int a[N], level[N], n; int lowbit(int x) { return x&-x; } int sum(int x) { int ret = 0; while(x > 0) ret += a[x], x -= lowbit(x); return ret; } void add(int x) { while(x < N) a[x]++, x += lowbit(x); } int main() { while(scanf("%d",&n) && n) { for(int i = 0 ; i < n; i++) { scanf("%d%d",&cow[i].x, &cow[i].y); cow[i].x++; cow[i].y++; cow[i].z = i; } memset(a, 0, sizeof(a)); sort(cow, cow+n); for(int i = 0; i < n; i++) { if(i && cow[i].x == cow[i-1].x && cow[i].y == cow[i-1].y) level[cow[i].z] = level[cow[i-1].z]; else level[cow[i].z] = sum(cow[i].x); add(cow[i].x); } printf("%d", level[0]); for(int i = 1; i < n; i++) printf(" %d", level[i]); puts(""); } return 0; }