[POJ2318]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.

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 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思路:{运用叉积的有关知识判断点,线的关系,降低时间复杂度的话可以考虑二分。}
 1 #include<map>
 2 #include<set>
 3 #include<deque>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #include<vector>
 8 #include<cstdio>
 9 #include<complex>
10 #include<cstring>
11 #include<cstdlib>
12 #include<iostream>
13 #include<algorithm>
14 #define maxx 5010
15 #define RG register
16 #define LL long long
17 #define db double
18 using namespace std;
19 int cnt[maxx];
20 struct point{
21   int x,y;
22   point() {}
23   point (int _x,int _y): x(_x),y(_y) {}
24   point operator -(const point a) const{
25     return point(x-a.x,y-a.y);
26   }
27   int operator *(const point a) const {
28     return x*a.x+y*a.y;
29   }
30   int operator ^(const point a) const {
31     return x*a.y-y*a.x;
32   }
33 }a[maxx];
34 int n,m,L,U,loop[maxx];
35 int main(){
36   int x,y,xx,yy;
37   while(scanf("%d",&n)&&n){memset(cnt,0,sizeof(cnt));
38     scanf("%d%d%d%d%d",&m,&x,&y,&xx,&yy);
39     a[0]=a[n+1]=point(0,y-yy);loop[0]=x,loop[n+1]=xx;
40     for(int i=1;i<=n;++i){
41       scanf("%d%d",&U,&L);
42       a[i]=point(U-L,y-yy);
43       loop[i]=L;
44     }
45     point aa;
46     for(int i=1;i<=m;++i){
47       scanf("%d%d",&x,&y);
48       int l=0,r=n+1;
49       while(l<=r){
50     int d=(l+r)>>1;aa=point(x-loop[d],y-yy);
51     if((aa^a[d])<0)r=d-1;
52     else l=d+1;
53       }cnt[l-1]++;
54     }
55     for(int i=0;i<=n;++i)
56       cout<<i<<": "<<cnt[i]<<‘\n‘;
57     cout<<‘\n‘;
58   }
59   return 0;
60 }
时间: 2024-10-12 12:36:54

[POJ2318]TOYS的相关文章

POJ2318 TOYS[叉积 二分]

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14433   Accepted: 6998 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 w

POJ-2318 TOYS 计算几何 判断点在线段的位置

题目链接:https://cn.vjudge.net/problem/POJ-2318 题意 在一个矩形内,给出n-1条线段,把矩形分成n快四边形 问某些点在那个四边形内 思路 二分+判断点与位置关系 提交过程 WA*n x1和x2,y1和y2在复制的时候没分清(哭 WA 可能存在二分问题? AC 代码 #define PI 3.1415926 #include <cmath> #include <cstdio> #include <vector> #include &

poj2318 TOYS 【计算几何】【点和线的关系】

题目链接:http://poj.org/problem?id=2318 题目大意:给你n,m,x1,y1,x2,y2表示的分别是n个线,m个点,(x1,y1)表示的是矩形左上角那个点,(x2,y2)表示的是矩形右下角那个点. 然后给出n个线(L)的x坐标L.s.x,L.e.x,就相当于是给出了线的位置,下面给出m个点的坐标. 最后问n条线分成的n+1个区域内各有多少个点. 题目不是很难,不过与二分结合起来还是有点意思的. 注意叉乘的性质,在什么时候叉乘的结果会是小于0什么时候会是大于0. 如果是

[poj2318]TOYS(直线与点的位置关系)

解题关键:计算几何入门题,通过叉积判断. 两个向量的关系: P*Q>0,Q在P的逆时针方向: P*Q<0,Q在P的顺时针方向: P*Q==0,Q与P共线. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> using namespace std; typede

POJ2318 TOYS (计算几何)

### 题目链接 ### 题目大意: 给定一个矩形,这个矩形被 \(n\) 条线段(端点分别在矩形上下边界上)切割成 \(n+1\) 个块.再给你 \(m\) 个物品的坐标,问每个块中会有多少个物品,保证物品放置位置合法. 分析: 一个物品在一个块中时,他一定夹在两个分界线中间,且在左分界线的右边,右分界线的左边.故按图中那样,将物品连接某个边界下端,构成一个向量,再判断 蓝色向量 与 紫色向量 的位置关系,进行叉积即可.故二分找到第一个 物品向量 \(×\) 边界向量 为负的位置,即为该物品所

POJ2398 Toy Storage(点与凸多边形位置关系)

题目链接: http://poj.org/problem?id=2398 题目描述: Toy Storage Description Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box to put his toys in. Unfortunately, Reza

poj分类解题报告索引

图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Journey poj1724 - ROADS(邻接表+DFS) BFS poj3278 - Catch That Cow(空间BFS) poj2251 - Dungeon Master(空间BFS) poj3414 - Pots poj1915 - Knight Moves poj3126 - Prim

poj2318(计算几何)

1.题目(theme) TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10488   Accepted: 5031 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 hi

POJ 2318 TOYS 叉积

题意: 给出一个矩形范围,给出n条线段,这n条线段一定与矩形上下边界相交且互不相交,将矩形分成n+1个划分.给出m个玩具的坐标.求每个划分放的玩具数,玩具保证不会在线段和左右边界上. 分析: 判断点是否在两条直线中间,利用叉积,如果在两条直线间,必定会有两个叉积一个小于0,一个大于0(不能把相乘小于0作为判断条件) #include <iostream> #include <cstdio> #include <cstring> using namespace std;