标签:
Toy Storage
Time Limit: 1000MS | Memory Limit: 65536K |
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
题解
和2318的题一样的,只是要排序一下,并且输出方式也不一样
代码
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; const int maxn = 5000+50; int ans[maxn]; struct Point { int x,y; Point(){} Point(int _x,int _y) { x = _x;y = _y; } Point operator -(const Point &b)const { return Point(x - b.x,y - b.y); } int operator *(const Point &b)const { return x*b.x + y*b.y; } int operator ^(const Point &b)const { return x*b.y - y*b.x; } }; struct Line { Point s,e; Line(){} Line(Point _s,Point _e) { s = _s;e = _e; } bool operator < (const Line &rhs) const{ if(s.x==rhs.s.x) return e.x<rhs.e.x; return s.x<rhs.s.x; } }; int xmult(Point p0,Point p1,Point p2) { return (p1-p0)^(p2-p0); } Line line[maxn]; int num[maxn]; int main() { int n,m,x1,x2,y1,y2; while(scanf("%d",&n)==1&&n){ scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); int Ui,Li; for(int i=0;i<n;i++){ scanf("%d%d",&Ui,&Li); line[i]=Line(Point(Ui,y1),Point(Li,y2)); } line[n]=Line(Point(x2,y1),Point(x2,y2)); sort(line,line+n+1); int x,y; Point p; memset(ans,0,sizeof(ans)); while(m--){ scanf("%d %d",&x,&y); p=Point(x,y); int l=0,r=n; int tmp; while(l<=r){ int mid=(l+r)/2; if(xmult(p,line[mid].s,line[mid].e)<0){ tmp=mid; r=mid-1; } else l=mid+1; } ans[tmp]++; } printf("Box\n"); memset(num,0,sizeof(num)); for(int i=0;i<=n;i++) if(ans[i]>0) num[ans[i]]++; for(int i=0;i<=n;i++) if(num[i]>0) printf("%d: %d\n",i,num[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5569574.html