Timus 1028
一看题意,感觉可以用线段树来做,但是二维挺难处理的,后来百度了一下,大牛们是将二维化为一维,因为点已经排好了序,我们就可以省去了一维,只考虑x,然后就是赤裸裸的线段树了,而且还不用事先建树。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node { int x,y; }point[15010]; int res[15010],tree[32000*4+10]; int insert(int i,int left,int right,int x) { int mid; if(left==right) return tree[i]++; tree[i]++; mid=(left+right)>>1; if(x <= mid) return insert(i*2,left,mid,x); return insert(i*2+1,mid+1,right,x)+tree[i*2]; } int main() { int i,n,k,xmax; while(scanf("%d",&n)!=EOF) { memset(res,0,sizeof(res)); memset(tree,0,sizeof(tree)); xmax=0; for(i=0;i<n;i++) { scanf("%d %d",&point[i].x,&point[i].y); xmax = xmax < point[i].x ? point[i].x : xmax; } for(i=0;i<n;i++) { k=insert(1,0,xmax,point[i].x); res[k]++; } for(i=0;i<n;i++) printf("%d\n",res[i]); } return 0; }