2318 TOYS

2398 Toy Storage

题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而2318要求输出的是有 i 个玩具的区间有几个。

思路 : 两个题基本差不多,只不过2398排一下序,然后再找个数组标记一下就行。

这个题我一开始没想到用二分,判断了点在四边形内但是没写下去,然后看了网上的二分区间,利用叉积判断点在左边还是右边。

2318代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <iostream>
 5 
 6 using namespace std ;
 7 
 8 struct point
 9 {
10     int x,y ;
11 }p ;
12 struct line
13 {
14     point a,b ;
15 } eline[5120] ;
16 
17 int s[5120] ;
18 
19 int xmult(point p1,point p2,point p0)
20 {
21     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;
22 }
23 
24 void binary_searc(point p,int a)
25 {
26     int l = 0, r = a-1 ,mid ;
27     while(l < r)
28     {
29         mid = (l + r) /2 ;
30         if(xmult(p,eline[mid].a,eline[mid].b) > 0) l = mid+1 ;
31         else r = mid ;
32     }
33     if(xmult(p,eline[l].a,eline[l].b) < 0) s[l] ++ ;
34     else s[l+1] ++ ;
35 }
36 int main()
37 {
38     int m,n,x1,x2,y1,y2 ;
39     while(scanf("%d",&n) != EOF)
40     {
41         if(n == 0) break ;
42         scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2) ;
43         memset(s,0,sizeof(s)) ;
44         for(int i = 0 ; i < n ; i++)
45         {
46             scanf("%d %d",&eline[i].a.x,&eline[i].b.x) ;
47             eline[i].a.y = y1 ;
48             eline[i].b.y = y2 ;
49         }
50         for(int i = 0 ; i < m ; i++)
51         {
52             scanf("%d %d",&p.x,&p.y) ;
53             binary_searc(p,n) ;
54         }
55         for(int i = 0 ; i <= n ; i++)
56             printf("%d: %d\n",i,s[i]) ;
57         printf("\n") ;
58     }
59     return 0 ;
60 }
View Code

相关文章: