题意:给一个凸多边形A,一个多边形B.问B是不是严格包含在A中
思路:A/B所有点算凸包,如果B有点在凸包上,则不行. 记住要特判最后一条边(求凸包不会考虑你最后一条是不是包含共线),用叉积判断
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <math.h>
#include<algorithm>
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
const int MAX_N=2e5+5;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
struct node{
ll x,y;
int flag;
};
node stackk[MAX_N];
node vex[MAX_N];
int sx,sy,n,m;
bool cmp1(node a,node b){
if(a.y==b.y)
return a.x<b.x;
else
return a.y<b.y;
}
ll cross(node a,node b,node c){
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(node a,node b){
return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp2(node a,node b)
{
if(cross(vex[0],a,b)==0)
return dis(vex[0],a)<dis(vex[0],b);
return cross(vex[0],a,b)>0;
}
node tb[MAX_N];
int graham(){
sort(vex,vex+n+m,cmp1);
stackk[0]=vex[0];
sx=stackk[0].x;
sy=stackk[0].y;
sort(vex+1,vex+n+m,cmp2);
stackk[1]=vex[1];
int top=1;
for(int i=2;i<n+m;i++){
while(top>=1 && cross(stackk[top-1],stackk[top],vex[i])<0)
top--;
stackk[++top]=vex[i];
}
return top;
}
int main(void){
cin >> n ;
memset(stackk,0,sizeof stackk);
memset(vex,0,sizeof vex);
for(int i=0;i<n;i++) scanf("%lld%lld",&vex[i].x,&vex[i].y);
cin >> m;
for(int i=n;i<=n+m-1;i++) scanf("%lld%lld",&vex[i].x,&vex[i].y),tb[i-n]=vex[i],vex[i].flag=1;
int top=graham();
for(int i=0;i<=top;i++){
if(stackk[i].flag){
cout <<"NO"<<endl ;
return 0;
}
}
for(int i=0;i<m;i++){
if(!cross(tb[i],stackk[0],stackk[top])){
cout <<"NO"<<endl;
return 0;
}
}
cout <<"YES"<<endl;
return 0;
}