题目:http://poj.org/problem?id=2352
题意:有n个点(x , y),坐标按y递增(y同时按x递增)给出,对于每个点,判断有多少个点在它坐下方(包括左边很右边)。依次输出有多少个点左下方有0个点、1个点……n-1各点。
思路:树状数组记录bit[ i ]记录有多少个点的x坐标小于等于i,因为x,y可以等于0,所以 bit[ x ] 对于坐标 x-1。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
#define INF 0x7fffffff
#define MOD 1000000007
using namespace std;
typedef long long ll;
int cnt[15005], bit[32005];
int sum(int i)
{
int s = 0;
while(i > 0)
{
s += bit[i];
i -= i & -i;
}
return s;
}
void add(int i, int x)
{
while(i <= 32003)
{
bit[i] += x;
i += i & -i;
}
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int n, x, y;
while(scanf("%d", &n) != EOF)
{
memset(cnt, 0, sizeof(cnt));
memset(bit, 0, sizeof(bit));
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x, &y);
int level = sum(x + 1);
//printf("level=%d\n", level);
cnt[level]++;
add(x + 1, 1);
}
for(int i = 0; i < n; i++)
printf("%d\n", cnt[i]);
}
return 0;
}