【计算几何】Codeforces Round #113 (Div. 2)-B. Polygons

来源:互联网 发布:搬瓦工vps建站 编辑:程序博客网 时间:2024/04/30 23:39

其实是很裸的一道几何题,题目要求的就是判断一个小的多边形是否完全且严格(两个多边形不能有交点)包含在另一个凸多边形里面。而解决的方法有很多,我这里用到的就是判断一个点是否完全且严格包含在一个多边形内,判断的时候用到了二分和叉积。

题目

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define N 100005struct node{    int x,y;}p[N];__int64 xcross(node t,node t1,node t2){    return (__int64)(t1.x-t.x)*(t2.y-t.y)-(__int64)(t2.x-t.x)*(t1.y-t.y);}int n;bool check(node t){    if(xcross(t,p[0],p[n-1])==0)return false;            //判断是否在线(0,1)上    if(xcross(t,p[1],p[0])==0)return false;            //判断是否在线(0,n-1)上    int l=0,r=n-1,best;    while(l<=r)    {        int m=(l+r)/2;        if(xcross(t,p[m],p[0])>=0)        {            best=m;            //这里得到的best是和点t最接近的那条边的一段            l=m+1;        }        else r=m-1;    }    if(xcross(t,p[best],p[best+1])>=0)return false;            //判断点t在线(best,best+1)的那一边    return true;}int main(){    //freopen("a.txt","r",stdin);    scanf("%d",&n);    for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);    int m;    scanf("%d",&m);    bool flag=true;    while(m--)    {        node t;        scanf("%d%d",&t.x,&t.y);        if(flag)flag=check(t);    }    if(flag)printf("YES\n");    else printf("NO\n");    return 0;}


原创粉丝点击