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(凸包划分)的更多相关文章

  1. UVa 10256 - The Great Divide 判断凸包相交

    模板敲错了于是WA了好几遍…… 判断由红点和蓝点分别组成的两个凸包是否相离,是输出Yes,否输出No. 训练指南上的分析: 1.任取红凸包上的一条线段和蓝凸包上的一条线段,判断二者是否相交.如果相交( ...

  2. UVa 10256 (判断两个凸包相离) The Great Divide

    题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...

  3. UVA 10256 The Great Divide (凸包,多边形的位置关系)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34148 [思路] 凸包 求出红蓝点的凸包,剩下的问题就是判断两个凸 ...

  4. UVa 10256 The Great Divide,推断两个凸包是否相离

    先从给出的两个点集中分别计算出两个凸包, 然后推断两个凸包是否相离. #include<cstdio> #include<vector> #include<cmath&g ...

  5. uva 10256 The Great Divide

    题意:给定两个点集,一个红点集,另一个蓝点集,询问,能否找到一条直线能,使得任取一个红点和蓝点都在直线异侧. 思路:划分成两个凸包,一个红包,一个蓝包.两个凸包不相交不重合. 1.任取一个凸包中的点不 ...

  6. UVA 10256 The Great Divide(点在多边形内)

    The Great Divid [题目链接]The Great Divid [题目类型]点在多边形内 &题解: 蓝书274, 感觉我的代码和刘汝佳的没啥区别,可是我的就是wa,所以贴一发刘汝佳 ...

  7. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  8. 【暑假】[数学]UVa 10375 Choose and divide

    UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...

  9. UVa 10256 凸包简单应用

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin

    场景: . webpack2.4.*集成vue-loader@15.7.2报错 原因: 参考官方文档 https://vue-loader.vuejs.org/migrating.html#a-plu ...

  2. Jumpserver安装过程

    Jumpserver 安装过程 可参照此官方文档搭建: http://docs.jumpserver.org/zh/docs/step_by_step.html 其中,需注意处: # docker   ...

  3. VPX板卡 基于XC7K325T的3U VPX FMC接口数据收发预处理平台

    一.板卡概述       标准VPX 3U板卡, 基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIe ...

  4. Linux就该这么学10学习笔记

    参考链接:https://www.linuxprobe.com/chapter-10.html 网站服务程序 第1步:把光盘设备中的系统镜像挂载到/media/cdrom目录. [root@linux ...

  5. 洛谷P3830 随机树(SHOI2012)概率期望DP

    题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度 解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq.题解参考https://blog.csdn.ne ...

  6. 在Linux服务器上运行jar包,并且使jar包一直处于后台执行

    1.我jar包在linux的目录为/a/bbb.jar         正常情况下,使用在/a目录下使用  java -jar bbb.jar 可以直接运行该jar包的项目,运行成功之后使用crtl+ ...

  7. MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)

    在mysql中执行以下命令:  drop database hive;  create database hive;  alter database hive character set latin1 ...

  8. vue之click事件绑定

    1.@click不光可以绑定方法,也可以就地修改data里的数据 代码示例代码如下: 2.@click绑定多个操作的时候用:隔开 代码示例代码如下: <el-table><el-ta ...

  9. [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树

    题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...

  10. 单例设计模式(Singleton)的优化

    单例模式的优化 单例模式懒汉式写法,单例模式的优化有以下四个方面: 使用同步保证线程安全synchronized 使用volatile关键字:volatile关键字提醒编译器后面所定义的变量随时都有可 ...