UVA 10256 The Great Divide(凸包划分)
The Great Divide
Input: standard input
Output: standard output
Time Limit: 8 seconds
Memory Limit: 32 MB
Somewhere in Gaul, there is a little village very like the village where Asterix and Obelix live. Not very long ago they had only one chief Altruistix and peace reigned in the village. But now those happy days are just dreams. The villagers are now divided. Some of the villagers have elected Majestix as their chief and the others have elected Cleverdix.

Majestix Cleverdix
The two chiefs have decided to divide the village into two parts by digging a straight ditch through the middle of the village so that the houses of the supporters of Majestix lie on one part and those of the followers of Cleverdix lie on the other. So, they have invitedGetafix, the venerable druid of Asterix’s village, to figure out whether such a dividing line exists or not.

Getafix
Since Getafix knows that you are so good in programming, he seeks your help.
Input
The input may contain multiple test cases.
The first line of each test case contains two integers M and C (1 £ M, C £ 500), indicating the number of houses of the supporters ofMajestix and Cleverdix respectively.
Each of the next M lines contains two integers x and y (-1000 £ x, y £ 1000) giving the co-ordinates of the house of a supporter ofMajestix. For convenience each house is considered as a single point on the plane.
Each of the next C lines contains two integers x and y (-1000 £ x, y £ 1000) giving the co-ordinates of the house of a supporter ofCleverdix.
The input will terminate with two zeros for M and C.
Output
For each test case in the input output a line containing either “Yes” or “No” depending on whether there exists a straight line that divides the two set of houses. The dividing line can NOT contain points of both sides.
Sample Input
4 3
100 600
200 400
600 500
300 700
400 100
600 200
500 300
4 3
100 600
400 100
600 200
500 300
200 400
600 500
300 700
0 0
Sample Output
Yes
No
判断两个点集是否相交,即有没有一条线段可以划分两个点集。
先求出凸包。
判断凸包中是否有一点在另一个凸包内。
判断凸包内是否有任意两条线段相交。
注意下,按坐标排序的时候要用dcmp来写。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = ;
const double eps = 1e- ;
int n1 , n2 ; int dcmp( double x ) { if( fabs(x)<eps) return ; return x<?-:;} struct Point {
double x , y ;
Point(){};
Point( double a, double b ) { x=a ,y=b; }
bool operator < ( const Point &a ) const {
return dcmp(x-a.x)< ||(dcmp(x-a.x)== && dcmp(y-a.y)<);
} }p1[N],p2[N],ch1[N],ch2[N];
Point operator - ( Point a , Point b ) {
return Point(a.x-b.x,a.y-b.y);
}
Point operator + ( Point a , Point b ) {
return Point(a.x+b.x,a.y+b.y);
}
double Cross( Point a , Point b ) { return a.x*b.y-a.y*b.x; }
double Dot( Point a , Point b ) { return a.x*b.x+a.y*b.y; } //test bool isPointOnSegment( Point p , Point a1 , Point a2 ) {
return dcmp( Cross(a1-p,a2-p)) == && dcmp(Dot(a1-p,a2-p)) < ;
} bool SegmentProperIntersection(Point a1 , Point a2 , Point b1 , Point b2 ) {
double c1 = Cross(a2-a1,b1-a1) , c2 = Cross(a2-a1,b2-a1),
c3 = Cross(b2-b1,a1-b1) , c4 = Cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2) < && dcmp(c3)*dcmp(c4) < ;
} bool isPointInPolygon( Point p , Point* poly , int n ) {
int wn = ;
for( int i = ; i < n ; ++i ) {
if( isPointOnSegment( p , poly[i] , poly[(i+)%n] ) ) return true;
int k = dcmp( Cross( poly[(i+)%n]-poly[i] , p - poly[i] ) );
int d1 = dcmp( poly[i].y - p.y );
int d2 = dcmp( poly[(i+)%n].y - p.y );
if( k > && d1<= && d2 > ) wn++ ;
if( k < && d2 <= && d1 > ) wn--;
}
if( wn != ) return true; // inside
return false; //outside
}
int ConvexHull(Point *p,int n,Point *ch)
{
sort(p,p+n);
int m=;
for(int i=;i<n;i++)
{
while(m> && Cross(ch[m-]-ch[m-], p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;i--)
{
while(m>k && Cross(ch[m-]-ch[m-], p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
if(n>) m--;
return m;
}
void Run() {
for( int i = ; i < n1 ; ++i ){
scanf("%lf%lf",&p1[i].x,&p1[i].y);
}
for( int i = ; i < n2 ; ++i ){
scanf("%lf%lf",&p2[i].x,&p2[i].y);
}
int m1 = ConvexHull(p1,n1,ch1), m2 = ConvexHull(p2,n2,ch2);
for( int i = ; i < m1 ; ++i )
if( isPointInPolygon(ch1[i],ch2,m2) ) { puts("No"); return ;}
for( int i = ; i < m2 ; ++i )
if( isPointInPolygon(ch2[i],ch1,m1) ) { puts("No"); return ;}
for( int i = ; i < m1 ; ++i ) {
for( int j = ; j < m2 ; ++j ){
if( SegmentProperIntersection( ch1[i],ch1[(i+)%m1],ch2[j],ch2[(j+)%m2]) ){
puts("No"); return ;
}
}
}
puts("Yes");
} int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
while( scanf("%d%d",&n1,&n2) == && n1 )Run();
}
UVA 10256 The Great Divide(凸包划分)的更多相关文章
- UVa 10256 - The Great Divide 判断凸包相交
模板敲错了于是WA了好几遍…… 判断由红点和蓝点分别组成的两个凸包是否相离,是输出Yes,否输出No. 训练指南上的分析: 1.任取红凸包上的一条线段和蓝凸包上的一条线段,判断二者是否相交.如果相交( ...
- UVa 10256 (判断两个凸包相离) The Great Divide
题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...
- UVA 10256 The Great Divide (凸包,多边形的位置关系)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34148 [思路] 凸包 求出红蓝点的凸包,剩下的问题就是判断两个凸 ...
- UVa 10256 The Great Divide,推断两个凸包是否相离
先从给出的两个点集中分别计算出两个凸包, 然后推断两个凸包是否相离. #include<cstdio> #include<vector> #include<cmath&g ...
- uva 10256 The Great Divide
题意:给定两个点集,一个红点集,另一个蓝点集,询问,能否找到一条直线能,使得任取一个红点和蓝点都在直线异侧. 思路:划分成两个凸包,一个红包,一个蓝包.两个凸包不相交不重合. 1.任取一个凸包中的点不 ...
- UVA 10256 The Great Divide(点在多边形内)
The Great Divid [题目链接]The Great Divid [题目类型]点在多边形内 &题解: 蓝书274, 感觉我的代码和刘汝佳的没啥区别,可是我的就是wa,所以贴一发刘汝佳 ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 【暑假】[数学]UVa 10375 Choose and divide
UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...
- UVa 10256 凸包简单应用
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- Linux文件行排序
sort:对文件的行排序 - 准备一份文件:char.txt - sort char.txt:结果会按照头字母顺序排 - sort -o sortchar.txt char.txt:排序char.tx ...
- 2018-2-13-C#-复制列表
title author date CreateTime categories C# 复制列表 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 +0 ...
- 创建工程时出现 A project with this name already exists 提示
https://segmentfault.com/a/1190000018513060 创建项目时没注意,后来发现放错了位置或其他问题,想要重新创建同名项目,只在文件夹处删除是不行的.会出现以下提示 ...
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- runltp出现问题 [
runltp 623行: if [ "$?" == "0" ]; then 对[解析出了问题. 我灵机一动,是不是sh的问题. which sh /bin/sh ...
- struts2中的Action实现的三种方式
Action类创建方式有哪些? 方式一:直接创建一个类,可以是POJO,即原生Java类,没有继承任何类,也没有实现任何接口 这种方式使得strust2框架的代码侵入性更低,但是这种方式是理想状态,开 ...
- java知识链接
Java内存模型简称jmm: 它定义了一个线程对另一个线程是可见的,另外就是共享变量的概念,因为Java内存模型又叫做共享内存模型,也就是多个线程会同时访问一个变量,这个变量又叫做共享变量, 共享变量 ...
- ruby语法之方法
ruby中的方法相当于python的函数 其定义规则为: 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常量,从而导致不正确地解析调用. 方法应在调用之前定义,否则 ...
- springMVC使用map接收入参 + mybatis使用map 传入查询参数
测试例子: controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错, ...
- shell脚本学习(5)join
join 不是简单的把两个文本连接起来 sale.txt quotas.txt