树状数组,果断1A啦,心情舒畅啊,哈哈
先按照y轴从小到大排序,然后一次加入并统计每个点得x坐标,这道题数据不严谨啊,在y轴相同得情况下,应该以x轴从大到小排序,可我都没排x轴就过了
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<memory.h>
using namespace std;
int Max;
struct node{
int x,y;
}a[15005];
int tree[32005];
bool cmp(node a,node b){
return a.y<b.y;
}
int lowbit(int x){
return x&(-x);
}
void add(int i,int val){
while(i<=Max){
tree[i]+=val;
i+=lowbit(i);
}
}
int sum(int i){
int r=0;
while(i>=1){
r+=tree[i];
i-=lowbit(i);
}
return r;
}
int main(){
// freopen("in.txt","r",stdin);
int n;
Max=0;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].x++;
a[i].y++;
if(a[i].x>Max) Max=a[i].x;
}
sort(a,a+n,cmp);
memset(tree,0,sizeof(tree));
int ans[15005];
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++){
add(a[i].x,1);
ans[sum(a[i].x)]++;
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
}