这道题的意思就是在笛卡尔坐标系上给你n个点,每个点有等级,等级表示的是在这个点的左下有多少个点。让你按顺序把所有的等级的个数输出。
思路 :
这题的输入是按照从·左向右从上向下的顺序的,所以直接用二维数组就好了
AC代码:
/* ***********************************************
Author :yzkAccepted
Created Time :2016/3/4 11:03:26
TASK :ggfly.cpp
LANG :C++
************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
typedef __int64 ll;
const int maxn=150010;
int n,a[maxn],lowbit[maxn],ans[maxn];
void add(int k)
{
while(k<maxn)
{
a[k]++;
k+=lowbit[k];
}
}
int sum(int k)
{
ll s=0;
while(k>0)
{
s+=a[k];
k-=lowbit[k];
}
return s;
}
int main()
{
for(int i=1;i<=maxn;i++)
lowbit[i]=i&(-i);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n))
{
int x,y;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++,y++;
ans[sum(x)]++;
add(x);
}
for(int i=0;i<n;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}