原文:http://blog.acmj1991.com/?p=685
题意:给你一些坐标,每个坐标都有等级,问你这一等级坐标点的个数。等级评判标准:不高于点且不在点右边的点的个数
思路:因为y轴是按顺序给出的,所以只要统计已给出点x轴左边点的个数,就是给点的等级
#include<stdio.h>
#include<string.h>
#define maxN 32010
#define maxM 15010
int ke[maxN],le[maxN],x[maxM],y,maxx;
int low(int x){return x&(-x);}
void add(int x,int w)
{
for(int i=x;i<=maxx;i+=low(i))
ke[i]+=w;
}
int get_sum(int x)
{
int sum=0;
for(int i=x;i>0;i-=low(i))
sum+=ke[i];
return sum;
}
int main()
{
int n;
scanf("%d",&n);
for(int j=0;j<n;j++){
scanf("%d%d",&x[j],&y);
x[j]++;
if(maxx<x[j])
maxx=x[j];
}
for(int j=0;j<n;j++){
le[get_sum(x[j])]++;
add(x[j],1);
}
for(int i=0;i<n;i++)
printf("%d\n",le[i]);
}