题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi, yi)满足xi<=x且yi<=y。
思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的点中找比自己小的。
Trick:注意的是累加的时候while循环的条件要改一下,因为我们这里是用x轴坐标的值作为c数组的下标,而x最大到32000,而不是n。
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 32000+10
#define LL long long
int cas=1,T;
int c[maxn];
int L[maxn];
int n;
int lowbit(int i)
{
return i&(-i);
}
int sum(int i)
{
int ans = 0;
while (i)
{
ans +=c[i];
i-=lowbit(i);
}
return ans;
}
void add(int i,int d)
{
while (i<=maxn)
{
c[i]+=d;
i+=lowbit(i);
}
}
int main()
{
//freopen("in","r",stdin);
while (scanf("%d",&n)!=EOF && n)
{
memset(c,0,sizeof(c));
memset(L,0,sizeof(L));
for (int i = 1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++;
L[sum(x)]++;
add(x,1);
}
for (int i = 0;i<n;i++)
printf("%d\n",L[i]);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}