美文网首页
(凸包判断)Codeforces166B Polygons

(凸包判断)Codeforces166B Polygons

作者: laochonger | 来源:发表于2018-08-05 22:40 被阅读0次

https://blog.csdn.net/xuh723/article/details/22451957
题意:给出两个图形,判断B是否在A中(不重)(保证AB不重点)
题解:因为时完全包含,所有只要对A,B一起求凸包,判断B中的点是否在凸包上出现即可。
若是没有完全包含这个条件,我们在算法中要将<=改为<(使得B中的点不会在凸包中两个A中点形成的线上),然后进行判断
在不完全包含条件下,若还不保证不重点,可以先将重点去除(无影响)


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
 
struct point
{
       double x,y;
       point(){}
       point(double _x,double _y)
       {
                    x=_x;y=_y;
       }
       point operator - (const point &b) const
       {
             return point(x-b.x,y-b.y);
       }
       bool operator < (const point &b) const
       {
            return x<b.x||x==b.x&&y<b.y;
       }
}res[120005],p[120005],pb[20005];
 
int na,nb,n;
 
int dcmp(double x)
{
    return (x>eps)-(x<-eps);
}
 
double cross(point a,point b)
{
       return a.x*b.y-b.x*a.y;
}
 
int andrew()
{
    sort(p,p+n);
    int m=0;
    for (int i=0;i<n;i++)
    {
        while (m>1&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
        res[m++]=p[i];
    }
    int k=m;
    for (int i=n-2;i>=0;--i)
    {
        while (m>k&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
        res[m++]=p[i];
    }
    if (m>1) --m;
    return m;
}
 
int main()
{
    while (scanf("%d",&na)!=EOF)
    {
          for (int i=0;i<na;i++)
          {
              scanf("%lf%lf",&p[i].x,&p[i].y);
          }
          scanf("%d",&nb);
          n=na+nb;
          for (int i=na;i<n;i++)
          {
              scanf("%lf%lf",&p[i].x,&p[i].y);
              pb[i-na]=p[i];
          }
          int m=andrew();
          bool flag=1;
          sort(pb,pb+nb);
          for (int i=0;i<m;i++)
          {
              int tmp=lower_bound(pb,pb+nb,res[i])-pb;//返回第一个大于等于res[i]的pb的下标
              if (dcmp(pb[tmp].x-res[i].x)==0&&dcmp(pb[tmp].y-res[i].y)==0) {flag=0;break;}//如果等于pb则说明B没有完全包含在A内,退出循环
          }
          if (flag==1) printf("YES\n");else printf("NO\n");
    }
    return 0;
}

相关文章

  • (凸包判断)Codeforces166B Polygons

    https://blog.csdn.net/xuh723/article/details/22451957题意:给...

  • 每日一问 20190303

    在求最优解时要求函数是凸函数,如何判断函数凸还是非凸? 首先我们的问题是判断函数是凸还是非凸,而不是函数是凸还是凹...

  • 凸包

    向量的叉乘就是由该两个向量所组成的平行四边形的面积(x1y2-x2y1).这个凸包不是太懂.先留模板在此这个是水平...

  • 凸包

    凸包最常用的凸包算法是Graham扫描法和Jarvis步进法Graham's Scan法这个算法是由数学大师葛立恒...

  • 凸包

    convexHull 实例

  • 凸包

    逼近多边形是轮廓的高度近似,但是有时候我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最...

  • maya显示点、边、面序号

    步骤: Display - >Polygons ->Component IDs

  • Python3 趣味系列题8 ------ 凸包动态绘制

    本文介绍利用Graham Scan算法获得凸包(平面凸包),并动态展示凸包的形成过程。下面用比较通俗的语言,介绍下...

  • 算法复习-geometric algo

    convex hull 凸包-video25&video26 凸包算法剖析https://cyw3.github....

  • 图像轮廓(2)

    1. 凸包 凸缺陷可以用来处理手势识别问题 points:轮廓clockwise:True:凸包按顺时针方向排列;...

网友评论

      本文标题:(凸包判断)Codeforces166B Polygons

      本文链接:https://www.haomeiwen.com/subject/vquivftx.html