Description
Input
Output
Sample Input
4 10 0 10 100 0 20 20 80 80 60 60 40 40 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0
Sample Output
Box 2: 5 Box 1: 4 2: 1
在poj2138的基础上对线段排序就ok
ACcode:
#include <cstring> #include <algorithm> #include <cstdio> #define maxn 5050 struct Point{ int x,y; Point (){} Point(int _x,int _y){ x=_x; y=_y; } bool operator<(Point b)const{ return (x-b.x==0)?y-b.y:x<b.x; } bool operator==(Point b)const{ return (x-b.x==0)&&(y-b.y==0); } }p[maxn]; struct Line{ Point s,e; Line(){} Line(Point _s,Point _e){ s=_s; e=_e; } bool operator <(Line t)const{ return (s==t.s)?e<t.e:s<t.s; } }my[maxn]; int ans[maxn]; int multi(Point p1,Point p2,Point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } int main(){ int n,m,x1,y1,x2,y2; while(~scanf("%d",&n),n){ scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); for(int i=0;i<n;++i){ int a,b; scanf("%d%d",&a,&b); my[i]=Line(Point(a,y1),Point(b,y2)); } my[n]=Line(Point(x2,y1),Point(x2,y2)); memset(ans,0,sizeof(ans)); std::sort(my,my+n+1); for(int i=1;i<=m;++i){ int x,y; scanf("%d%d",&x,&y); Point tmp=Point(x,y); int l=0,r=n,id; while(l<=r){ int mid=(l+r)>>1; if(multi(my[mid].s,my[mid].e,tmp)<0){ id=mid; r=mid-1; } else l=mid+1; } ans[id]++; } std::sort(ans,ans+n+1); puts("Box"); int cnt; for(int i=0;i<=n;++i){ cnt=1; if(ans[i]==0)continue; while(ans[i]==ans[i+1]){ i++; cnt++; } printf("%d: %d\n",ans[i],cnt); } } return 0; } /* 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0 */