标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 11293 | Accepted: 5439 |
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
Source
/** 题意:给一个区域的左上和右上坐标,然后给出区域中的n条边,然后,给出m个玩具的坐标; 求每个玩具都在那个区域 做法:计算几何 **/ #include <iostream> #include<cmath> #include<algorithm> #include<string.h> #include<stdio.h> #define maxn 5000 + 10 using namespace std; int n,m; int mmap[maxn]; const double eps = 1e-8; const double PI = acos(-1.0); struct Point { double x; double y; Point() {} Point(double _x,double _y) { x = _x; y = _y; } Point operator - (const Point &b) const { return Point(x - b.x,y - b.y); } double operator ^(const Point &b) const { return x*b.y - y*b.x; } double operator *(const Point &b) const { return x*b.x + y*b.y; } }; struct Line { Point s; Point e; Line() {} Line(Point _s,Point _e) { s = _s; e = _e; } } line[maxn]; int mul(Point a,Point b,Point c) { return (b - a) ^(c - a); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int x1,y1,x2,y2; while(~scanf("%d",&n)) { if(n == 0) break; memset(mmap,0,sizeof(mmap)); scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2); int u,l; for(int i=0; i<n; i++) { scanf("%d %d",&u,&l); line[i] = Line(Point(u,y1),Point(l,y2)); } line[n] = Line(Point(x2,y1),Point(x2,y2)); int x,y; for(int i=0; i<m; i++) { scanf("%d %d",&x,&y); Point pp = Point(x,y); int left = 0; int right = n; int tmp = 0; while(left <= right) { int mid = (left + right) >>1; if(mul(pp,line[mid].s,line[mid].e)<0) { tmp = mid; right = mid-1; } else left = mid+1; } mmap[tmp] ++; } for(int i=0; i<=n; i++) { printf("%d: %d\n",i,mmap[i]); } printf("\n"); } }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4434404.html