POJ2318 计算几何简单题
2017-09-26 20:25
267 查看
TOYS
Description
Calculate the number of toys that land in each bin of a partitioned toy box.
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the
toys get mixed up, and it is impossible for John to find his favorite toys.
John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example
toy box.
![](http://poj.org/images/2318_1.jpg)
For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.
Input
The input file contains one or more problems. The first line of a problem consists of six integers, n m x1 y1 x2 y2. The number of cardboard partitions is n (0 < n <= 5000) and the number of toys is m (0 < m <= 5000). The coordinates of the upper-left corner
and the lower-right corner of the box are (x1,y1) and (x2,y2), respectively. The following n lines contain two integers per line, Ui Li, indicating that the ends of the i-th cardboard partition is at the coordinates (Ui,y1) and (Li,y2). You may assume that
the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right. The next m lines contain two integers per line, Xj Yj specifying where the j-th toy has landed in the box. The order of the toy locations is
random. You may assume that no toy will land exactly on a cardboard partition or outside the boundary of the box. The input is terminated by a line consisting of a single 0.
Output
The output for each problem will be one line for each separate bin in the toy box. For each bin, print its bin number, followed by a colon and one space, followed by the number of toys thrown into that bin. Bins are numbered from 0 (the leftmost bin) to n (the
rightmost bin). Separate the output of different problems by a single
4000
blank line.
Sample Input
Sample Output
Hint
As the example illustrates, toys that fall on the boundary of the box are "in" the box.
Source
Rocky Mountain 2003
输入m个点,二分判断这些点在哪个区间内就好。用叉积判断点是否在某条线段的左边。
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16392 | Accepted: 7862 |
Calculate the number of toys that land in each bin of a partitioned toy box.
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the
toys get mixed up, and it is impossible for John to find his favorite toys.
John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example
toy box.
![](http://poj.org/images/2318_1.jpg)
For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.
Input
The input file contains one or more problems. The first line of a problem consists of six integers, n m x1 y1 x2 y2. The number of cardboard partitions is n (0 < n <= 5000) and the number of toys is m (0 < m <= 5000). The coordinates of the upper-left corner
and the lower-right corner of the box are (x1,y1) and (x2,y2), respectively. The following n lines contain two integers per line, Ui Li, indicating that the ends of the i-th cardboard partition is at the coordinates (Ui,y1) and (Li,y2). You may assume that
the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right. The next m lines contain two integers per line, Xj Yj specifying where the j-th toy has landed in the box. The order of the toy locations is
random. You may assume that no toy will land exactly on a cardboard partition or outside the boundary of the box. The input is terminated by a line consisting of a single 0.
Output
The output for each problem will be one line for each separate bin in the toy box. For each bin, print its bin number, followed by a colon and one space, followed by the number of toys thrown into that bin. Bins are numbered from 0 (the leftmost bin) to n (the
rightmost bin). Separate the output of different problems by a single
4000
blank line.
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
As the example illustrates, toys that fall on the boundary of the box are "in" the box.
Source
Rocky Mountain 2003
输入m个点,二分判断这些点在哪个区间内就好。用叉积判断点是否在某条线段的左边。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 5010; 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; } }line[maxn]; int a[maxn]; int n,m,x1,y1,x2,y2; int mul(point p0, point p1, point p2){ return (p1-p0)^(p2-p0); } void init(){ int ui,li; scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2); for (int i=0; i<n; i++) { scanf("%d %d",&ui,&li); line[i] = Line(point(ui,y1),point(li,y2)); } line = Line(point(x2,y1),point(x2,y2)); memset(a,0,sizeof(a)); } void solve(int xx, int yy){ int left =0 , right=n, mid, tmp=0; point p; p = point(xx,yy); while (left<=right){ mid = (left+right)>>1; if (mul(p,line[mid].s,line[mid].e)<0) { tmp = mid; right = mid-1; } else left = mid+1; } a[tmp]++; } int main(){ bool flag=0; while (scanf("%d",&n) && n){ init(); int xx,yy; for (int i=0; i<m; i++) { scanf("%d %d",&xx,&yy); solve(xx,yy); } if (flag) printf("\n"); flag = 1; for (int i=0; i<=n; i++) printf("%d: %d\n",i,a[i]); } return 0; }
相关文章推荐
- POJ2318 计算几何利用简单的叉积运算
- 二分+叉积 apio2011 陈可卿 计算几何的一道简单题 poj2318 兼集训总结
- 计算几何的简单模板
- POJ 2405 Beavergnaw (计算几何-简单的问题)
- 计算几何 点到线段的距离 点在简单多边形内 点到凸多边形的距离
- hdu 4709 Herding (简单计算几何)
- hdu 1245 Saving James Bond 最短路spfa+简单计算几何
- ZOJ 1608 Two Circles and a Rectangle(简单计算几何)
- hdu 4643(简单计算几何)
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) D (简单计算几何)
- POJ 2850 Stacking Cylinders 简单计算几何
- Rectangles 简单几何计算
- HDU2948Geometry Darts(简单计算几何)
- uva 10112 - Myacm Triangles 简单计算几何+枚举
- 简单介绍几个计算几何的资源
- POJ1269 简单的计算几何判断直线相交
- 简单数学题或者计算几何:Codeforces 659D-Bicycle Race
- hdu 4720 计算几何简单题
- POJ 4048 Chinese Repeating Crossbow 简单计算几何
- POJ2318 TOYS 和POJ2398 Toy Storage题解(点在四边形内)(简单几何)