现在的位置: 首页 > 综合 > 正文

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

2019年09月23日 ⁄ 综合 ⁄ 共 913字 ⁄ 字号 评论关闭

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

题目

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005
struct 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;
}


抱歉!评论已关闭.