hlg1429凸多边形 二分+叉积






























凸多边形





Time Limit: 2000 MS Memory Limit: 65536 K







Total Submit: 154(27
users)
Total Accepted: 50(22
users)
Rating:  Special Judge: No
Description

已知一个凸多边形A(包含n个点,点按照顺时针给出),和一个点集B(包含m个点),请判断这m个点是否都严格在凸多边形A内部。

Input

输入包含多组测试数据。

对于每组测试数据:

第1行,包含一个整数n (3?≤ n ≤?105)代表着凸多边形A的点的数量。

接下来n行每行包含一个坐标(x,
y
)
(-109 ≤ x,
y
 ≤?109) 表示这个凸多边形,点按照顺时针给出。

n +
2行,包含一个整数m (3?≤ m ≤?105)代表着点集B的点的数量。

接下来m行每行包含一个坐标(x,
y
)
(-109 ≤ x,
y
 ≤?109) 表示这个点集B

处理到文件结束

Output

对于每组测试数据:

第1行,如果点集B都严格在凸多边形A内,输出YES,否则输出NO。

Sample Input

4

-10 -10

-10 10

10 10

10 -10

3

0 0

1 1

2 2

4

-10 -10

-10 10

10 10

10 -10

3

100 100

1 1

2 2

Sample Output

YES

NO

Author
齐达拉图@HRBUST

思路:二分+叉积

代码:


 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 const int maxn = 100005;
8 typedef long long LL;
9
10 struct Node
11 {
12 LL x;
13 LL y;
14 }node1[maxn], node2[maxn];
15
16 LL cross(Node n0, Node n1, Node n2)
17 {
18 return (n1.x - n0.x)*(n2.y - n0.y) - (n2.x - n0.x)*(n1.y - n0.y);
19 }
20
21 int main()
22 {
23 int n, m;
24 while(scanf("%d",&n) != EOF)
25 {
26 for(int i = 0; i < n; i++)
27 scanf("%lld %lld",&node1[i].x, &node1[i].y);
28 scanf("%d",&m);
29 for(int i = 0; i < m; i++)
30 scanf("%lld %lld",&node2[i].x, &node2[i].y);
31 bool ans = true;
32 for(int i = 0; i < m; i++)
33 {
34 if(cross(node1[0], node1[1], node2[i]) >= 0 || cross(node1[0], node1[n-1], node2[i]) <= 0)
35 {
36 ans = false;
37 break;
38 }
39 int front = 1, end = n - 1;
40 while(end - front != 1)
41 {
42 int mid = (front + end)>>1;
43 if(cross(node1[0], node1[mid], node2[i]) >= 0)
44 end = mid;
45 else
46 front = mid;
47 }
48 if(cross(node1[front], node2[i], node1[end]) <= 0)
49 {
50 ans = false;
51 break;
52 }
53 }
54 if(ans)
55 printf("YES\n");
56 else
57 printf("NO\n");
58 }
59 return 0;
60 }

hlg1429凸多边形 二分+叉积,码迷,mamicode.com

时间: 2024-10-06 01:19:12

hlg1429凸多边形 二分+叉积的相关文章

二分+叉积判断方向 poj 2318

1 // 题意:问你每个区域有多少个点 2 // 思路:数据小可以直接暴力 3 // 也可以二分区间 4 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <algorithm> 9 #include <map> 10 #include <set> 11 #include <queue> 12 #include <std

poj 2398 Toy Storage【二分+叉积】

二分点所在区域,叉积判断左右 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int N=1005; int T,n,m,x1,y1,x2,y2,ans[N],cnt[N]; struct dian { double x,y; dian(double X=0,d

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 2398 Toy Storage(叉积+二分)

题目链接:POJ 2398 Toy Storage 之前做的类似题目:POJ 2318 TOYS [题意]跟之前做的POJ 2318差不多额,给你一个矩形,有被若干直线分成N个格子,给出M个点(玩具)的坐标,问你放有t个玩具的格子的个数. [思路]其实跟POJ 2318差不多,利用叉积+二分,但是本题中直线的输入不是按顺序的,要进行排序,才能做二分.开始写错了构造函数,然后就一直不对啊,看来C++的学习之路还很远啊. 1 /* 2 ** POJ 2398 Toy Storage 3 ** Cre

POJ 2318 TOYS(叉积+二分or暴力)

题目链接:POJ 2318 TOYS [写在前面]前几天跟队友分了方向,学渣开始进行计算几何的专题了,真是脑壳有点痛啊.但是我想做多了就没这么坑爹了 [题意]大体意思就是给你一个矩形,有被若干直线分成N个格子,给出M个点的坐标,问你每个点位于哪个格子中. [思路]其实就是点在凸四边形内的判断,然后就可以利用叉积的性质,当然可以用暴力枚举也可以过,但是时间复杂度有点高,最好是用二分求解.(一直觉得二分真是牛逼啊) 下面贴AC代码,用二分219MS就过了: 1 /* 2 ** POJ 2318 TO

TOYS (poj 2381 叉积+二分)

Language: Default TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11718   Accepted: 5653 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 pu

POJ 2318 TOYS【叉积+二分】

今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这个盒子里,问每个区域分别有多少个玩具. 思路:首先,用叉积判断玩具是否在木板的左边,再用二分找到符合的最右边的木板,该木板答案加一. #include<stdio.h> #include<string.h> struct point{ int x,y; point(){} point(

POJ 2318 TOYS(点与直线的关系 叉积&amp;&amp;二分)

题目链接 题意: 给定一个矩形,n个线段将矩形分成n+1个区间,m个点,问这些点的分布. 题解: 思路就是叉积加二分,利用叉积判断点与直线的距离,二分搜索区间. 代码: 最近整理了STL的一些模板,发现真是好用啊orz,为啥以前没发现呢,可能是比较懒吧-.- #include <stdio.h> #include <string.h> #include <cmath> #include <iostream> #include <queue> #i

POJ 2318--TOYS(二分找点,叉积判断方向)

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