http://poj.org/problem?id=2398
这道题和上一道TOYS是一样的 就是输出不一样 还有就是这个给的是乱序 你要先对挡板排序
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 5500 typedef long long ll; struct node { int x, y, v; }p[N],u[N]; int y2; int cmp(const void *a,const void *b) { struct node *c, *f; c=(struct node *)a; f=(struct node *)b; return c->x-f->x; } int Find(int nx,int ny,int l,int r) { if(l==r-1) return l; int mid=(l+r)/2; node d; d.x=nx-p[mid].v; d.y=ny-y2; if((d.x*p[mid].y)-(d.y*p[mid].x)>0) { l=mid; r=r; return Find(nx,ny,l,r); } else if((d.x*p[mid].y)-(d.y*p[mid].x)<0) { l=l; r=mid; return Find(nx,ny,l,r); } return 0; } int main() { int n,m,x1,x2,y1,a[N]; while(scanf("%d",&n),n) { memset(a,0); scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2); p[0].x=x1; p[0].y=y2; p[0].v=x1; for(int i=1;i<=n;i++) { scanf("%d %d",&u[i].x,&u[i].y); } qsort(u+1,n,sizeof(u[0]),cmp); for(int i=1;i<=n;i++) { p[i].x=u[i].x-u[i].y; p[i].y=y1-y2; p[i].v=u[i].y; } p[n+1].x=x2; p[n+1].y=y1; p[n+1].v=x2; int k,v; for(int i=0;i<m;i++) { scanf("%d %d",&k,&v); int aa=Find(k,v,0,n+1); a[aa]++; } int ans[N]; memset(ans,0); for(int i=0;i<=n;i++) { if(a[i]) { ans[a[i]]++; } } printf("Box "); for(int i=1;i<=n;i++) { if(ans[i]) printf("%d: %d ",i,ans[i]); } } return 0; }