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