问题描述
坐标系平面上有好多棋子,每个整点上至多有一个棋子。
假定棋子的等级是左下方的棋子个数,现在给出若干棋子的位置,求不同等级的棋子各有多少个。左下方包含正下和正右。说明(0, 0) 坐标的位置在左下角。
输入格式
第一行一个整数 N (1≤N≤100000)
接下来 N 行,一行两个整数 X,Y (0≤X,Y<100000),表示坐标。
数据保证坐标先按 Y 排序,再按 X 排序。
输出格式
N 行,每行一个整数,从 0 到 N−1 等级的棋子数量。
样例输入
5
1 1
5 1
7 1
3 3
5 5
样例输出
1
2
1
1
0
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N=(1e5)+50;
int C[MAX_N];
int ans[MAX_N];
int tot;
int lowbit(int x){
return x&(-x);
}
void change(int p,int v){
for(;p<=tot;p+=lowbit(p)){
C[p]+=v;
}
return;
}
int getsum(int p){
int res=0;
for(;p;p-=lowbit(p)){
res+=C[p];
}
return res;
}
int main(){
memset(ans,0,sizeof(ans));
cin>>tot;
for(int i=1;i<=tot;i++){
int x,y;
cin>>x>>y;
x++;
y++;
ans[getsum(x)]++;
change(x,1);
}
for(int i=0;i<tot;i++)cout<<ans[i]<<endl;
return 0;
}