思路:二维偏序,一维排序,一维树状数组查询即可。
#include<bits/stdc++.h> using namespace std; #define maxn 33333 int ans[maxn],n,sum[maxn]; int lowbit(int x) { return x&(-x); } struct node { int x,y; bool operator < (const node &b)const { if(x==b.x)return y<b.y; return x<b.x; } } a[maxn]; void add(int x,int d) { while(x<=32001) { sum[x]+=d; x+=lowbit(x); } } int getsum(int x) { int ret=0; while(x>0) { ret+=sum[x]; x-=lowbit(x); } return ret; } int main() { while(scanf("%d",&n)!=EOF) { memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); for(int i=1; i<=n; i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+1+n); for(int i=1; i<=n; i++) { ans[getsum(a[i].y+1)]++; add(a[i].y+1,1); } for(int i=0; i<n; i++)printf("%d ",ans[i]); } return 0; }