标签:
TOYS
Time Limit: 2000MS | Memory Limit: 65536K |
Description
Input
Output
Sample Input
5 6 0 10 60 0 3 1 4 3 6 8 10 10 15 30 1 5 2 1 2 8 5 5 40 10 7 9 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 25 10 35 10 45 10 55 10 65 10 75 10 85 10 95 10 0
Sample Output
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
Hint
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> 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; } }; int xmult(Point p0,Point p1,Point p2) //叉积 { return (p1-p0)^(p2-p0); } Line line[maxn]; int main() { int n,m,x1,x2,y1,y2; bool flag=true; while(scanf("%d",&n)==1&&n){ if(flag) flag=false; else printf("\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)); 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]++; } for(int i=0;i<=n;i++) printf("%d: %d\n",i,ans[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5569470.html