视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CodeforcesRound#113(Div.2)B判断多边形是否在凸包内
2020-11-09 07:19:36 责编:小采
文档


题目点击打开链接 凸多边形A, 多边形B, 判断B是否严在A内。 注意AB有重点 。 将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候,

题目点击打开链接

凸多边形A, 多边形B, 判断B是否严格在A内。

注意AB有重点 。

将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。

或者说B上的某点在凸包的边上则也说明B不严格在A里面。

这个处理有个巧妙的方法,只需在求凸包的时候, <= 改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。

另外不能去重点。


int cmp(double x){
 if(fabs(x) < 1e-8) return 0 ;
 return x > 0 ? 1 : -1 ;
}

struct point{
 double x , y ;
 int k ;
 point(){}
 point(double _x , double _y):x(_x) , y(_y){}
 point operator - (const point &o){
 return point(x - o.x , y - o.y) ;
 }
 friend double operator ^ (const point &a , const point &b){
 return a.x * b.y - a.y * b.x ;
 }
 friend bool operator < (const point &a , const point &b){
 if(cmp(a.x - b.x) != 0) return cmp(a.x - b.x) < 0 ;
 if(cmp(a.y - b.y) != 0) return cmp(a.y - b.y) < 0 ;
 return a.k < b.k ;
 }
 friend bool operator == (const point &a , const point &b){
 return cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0 ;
 }
};

vector convex_hull(vector a){
 vector s(a.size() * 2 + 5) ;
 sort(a.begin() , a.end()) ;
 int m = 0 ;
 for(int i = 0 ; i < a.size() ; i++){
 while(m > 1 && cmp((s[m-1] - s[m-2]) ^ (a[i] - s[m-2])) < 0) m-- ;
 s[m++] = a[i] ;
 }
 int k = m ;
 for(int i = a.size() - 2 ; i >= 0 ; i--){
 while(m > k && cmp((s[m-1] - s[m-2]) ^ (a[i] - s[m-2])) < 0) m-- ;
 s[m++] = a[i] ;
 }
 s.resize(m) ;
 if(a.size() > 1) s.resize(m-1) ;
 return s ;
}

int main(){
 int i , n , m , ans = 0 ;
 vector lis(200000) ;
 cin>>n;
 for(i = 0 ; i < n ; i++){
 scanf("%lf%lf" , &lis[i].x , &lis[i].y) ;
 lis[i].k = 0 ;
 }
 cin>>m ;
 for(i = 0 ; i < m ; i++){
 scanf("%lf%lf" , &lis[n+i].x , &lis[n+i].y) ;
 lis[n+i].k = 1 ;
 }
 lis.resize(n + m) ;
 vector hull = convex_hull(lis) ;
 for(i = 0 ; i < hull.size() ; i++){
 if(hull[i].k){
 ans = 1 ;
 break ;
 }
 }
 printf("%s\n" , ans ? "NO" : "YES") ;
 return 0 ;
}

下载本文
显示全文
专题