1 //UVALive7461 - Separating Pebbles 判断两个凸包相交
  2
  3 #include <bits/stdc++.h>
  4 using namespace std;
  5 #define LL long long
  6 typedef pair<int,int> pii;
  7 const int inf = 0x3f3f3f3f;
  8 const int N =1e5+10;
  9 #define clc(a,b) memset(a,b,sizeof(a))
 10 const double eps = 1e-8;
 11 const int MOD = 1e9+7;
 12 void fre() {freopen("in.txt","r",stdin);}
 13 void freout() {freopen("out.txt","w",stdout);}
 14 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
 15
 16 int sgn(double x) {
 17     if(fabs(x) < eps)return 0;
 18     if(x < 0)return -1;
 19     else return 1;
 20 }
 21
 22 struct Point {
 23     int x,y;
 24     Point() {}
 25     Point(int _x,int _y) {
 26         x = _x;
 27         y = _y;
 28     }
 29     Point operator -(const Point &b)const {
 30         return Point(x - b.x,y - b.y);
 31     }
 32     int operator ^(const Point &b)const {
 33         return x*b.y - y*b.x;
 34     }
 35     int operator *(const Point &b)const {
 36         return x*b.x + y*b.y;
 37     }
 38     friend int dis2(Point a) {
 39         return a.x*a.x+a.y*a.y;
 40     }
 41     friend bool operator<(const Point &a,const Point &b){
 42         if(fabs(a.y-b.y)<eps) return a.x<b.x;
 43         return a.y<b.y;
 44     }
 45 };
 46 typedef Point Vector;
 47 double Dot(Point A, Point B){return A.x*B.x+A.y*B.y;}//点积
 48 double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}//叉积
 49 double Length(Vector A){return sqrt(Dot(A,A));}//OA长
 50 double Angle(Point A,Point B){return acos(Dot(A,B)/Length(A)/Length(B));}//OA和OB的夹角
 51 //判断线段相交,不在端点相交
 52 bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2){
 53     double c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1),c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
 54     return sgn(c1)*sgn(c2)<0&&sgn(c3)*sgn(c4)<0;
 55 }
 56
 57 int graham(Point p[],int n,Point q[]){
 58      int top=1;
 59      sort(p,p+n);
 60      if(n==0) return 0;
 61      q[0]=p[0];
 62      if(n==1) return 1;
 63      q[1]=p[1];
 64      if(n==2) return 2;
 65      q[2]=p[2];
 66      for(int i=2;i<n;i++){
 67          while(top&&(Cross(q[top]-q[top-1],p[i]-q[top-1])<=0)) top--;
 68          q[++top]=p[i];
 69      }
 70      int len=top;
 71      q[++top]=p[n-2];
 72      for(int i=n-3;i>=0;i--){
 73          while(top!=len&&(Cross(q[top]-q[top-1],p[i]-q[top-1])<=0)) top--;
 74          q[++top]=p[i];
 75      }
 76      return top;
 77 }
 78
 79 bool C_S(Point *ch1,int t1,Point *ch2,int t2)//判断凸包是否相交
 80 {
 81     double angle[1010],x;
 82     int i,j,k,m;
 83     if(t1==1)return true;
 84     if(t1==2)
 85     {
 86         for(i=0;i<t2;i++)
 87         {
 88             k=sgn(Cross(ch1[1]-ch1[0],ch2[i]-ch1[0]));
 89             if(k==0&&Dot(ch1[1]-ch1[0],ch2[i]-ch1[0])>0)
 90             {
 91                 if(Length(ch2[i]-ch1[0])<Length(ch1[1]-ch1[0]))break;
 92             }
 93         }
 94         if(i<t2)return false;
 95         if(t2==2&&SegmentProperIntersection(ch1[0],ch1[1],ch2[0],ch2[1]))return false;
 96         return true;
 97     }
 98     angle[0]=0;
 99     for(i=2;i<t1;i++)
100     angle[i-1]=Angle(ch1[1]-ch1[0],ch1[i]-ch1[0]);
101     for(i=0;i<t2;i++)
102     {
103         j=sgn(Cross(ch1[1]-ch1[0],ch2[i]-ch1[0]));
104         if(j<0||(j==0&&Dot(ch1[1]-ch1[0],ch2[i]-ch1[0])<0))continue;
105         j=sgn(Cross(ch1[t1-1]-ch1[0],ch2[i]-ch1[0]));
106         if(j>0||(j==0&&Dot(ch1[t1-1]-ch1[0],ch2[i]-ch1[0])<0))continue;
107         x=Angle(ch1[1]-ch1[0],ch2[i]-ch1[0]);
108         m=lower_bound(angle,angle+t1-1,x)-angle;
109         if(m==0)j=0;
110         else j=m-1;
111         k=sgn(Cross(ch1[j+1]-ch2[i],ch1[j+2]-ch2[i]));
112         if(k>=0)break;
113     }
114     if(i<t2)return false;
115     return true;
116 }
117
118 Point p1[300],p2[300],ch1[300],ch2[300];
119 int main(){
120     int T;
121     scanf("%d",&T);
122     while(T--){
123         int n;
124         scanf("%d",&n);
125         int cnt1=0,cnt2=0;
126         for(int i=0;i<n;i++){
127             int x,y,c;
128             scanf("%d%d%d",&x,&y,&c);
129             if(c==0){
130                 p1[cnt1++]=Point(x,y);
131             }
132             else p2[cnt2++]=Point(x,y);
133         }
134         int t1=graham(p1,cnt1,ch1);
135         int t2=graham(p2,cnt2,ch2);
136         if(C_S(ch1,t1,ch2,t2)&&C_S(ch2,t2,ch1,t1)) printf("1\n");
137         else printf("0\n");
138     }
139 }

转载于:https://www.cnblogs.com/ITUPC/p/5987593.html

UVALive7461 - Separating Pebbles 判断两个凸包相交相关推荐

  1. python判断两线段是否相交_c语言 判断两直线段是否相交

    转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...

  2. 用matlab判断两个球是否相交,判断两个矩阵相交

    判断两个矩阵相交 最近在回顾hihocoder上自己做过的题,看到清理海报这道题目,http://hihocoder.com/problemset/problem/1273?sid=707390当初比 ...

  3. 快速排斥实验amp;跨立实验 判断两直线是否相交

    两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的. 也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上 ...

  4. 如何判断两个平面相交_初一数学下册预习第五章 相交线与平行线上

    初一数学下册预习第五章    相交线与平行线上 平面内,点与直线之间的位置关系分为两种:① 点在线上    ② 点在线外同一平面内,两条或多条不重合的直线之间的位置关系只有两种:① 相交    ② 平 ...

  5. hdu 1086(判断两线段是否相交)

    题意:给出一些线段,问有多少个交点. 解题思路:这里实际就是一个线段相交的模型,下面这个图给出了思路. 如果两线段相交,则两线段必然相互跨立对方.若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ...

  6. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  7. 如何判断两个平面相交_七年级下册相交线与平行线全章节复习

    5.1 相交线 (一)相交线 两条直线相交,形成4个角. 1.两条直线相交所成的四个角中,相邻的两个角叫做邻补角,特点是两个角共用一条边,另一条边互为反向延长线,性质是邻补角互补:相对的两个角叫做对顶 ...

  8. 判断两个矩形相交以及求出相交的区域

    问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...

  9. Solution 7: 判断两链表是否相交

    问题描述 RT. 解决思路 (1) 两链表都是单向链表:判断两链表的末尾节点是否相同: (2) 两链表中一个有环,一个没环:不可能相交: (3) 两链表都有环:slow-fast双指针方法. 程序 p ...

  10. 如何判断链表有环、如何判断两个链表相交

    如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...

最新文章

  1. NUTCH的安装与测试
  2. 计算机发展最新趋势素材,计算机方面论文范文素材,与关于计算机科学与技术的趋势探究相关论文网...
  3. 未声明spire。它可能因保护级别而不可访问_信息系统安全:访问控制技术概述...
  4. OpenCV图像的轮廓的匹配
  5. mysql索引创建及使用注意事项
  6. 【编撰】linux IPC 001 - 概述
  7. 修饰类方法(静态方法)
  8. Fastify 系列教程三 (验证、序列化和生命周期)
  9. 使用windows live writer连接CSDN和博客园博客
  10. 知识分享:C语言语法总结,初学者可收藏
  11. java 字符串替换
  12. 求边长为一的正方体中,面对角线组成的正四面体体积.
  13. Animation动画播放
  14. Maven配置文件示例
  15. 百度地图api周边搜索功能,用单选按钮切换搜索类型
  16. 什么是安迪比尔定理?
  17. PPC与PC无线连接(Wi-Fi)
  18. Python爬虫 - 获取网页编码
  19. 基于惠斯顿电桥的压力传感器的解决方案
  20. Ubuntu20.04 OpenSlide 读图Bug 解决

热门文章

  1. 关于零信任的 “灵魂” 12问,企业未来如何适配“零信任”?
  2. BUUCTF_Web题目题解记录2
  3. 阿里云思维导图系列(一)开篇
  4. linux xps文件,XPS文件擴展名: 它是什麼以及如何打開它?
  5. 深度学习(Deep Learning)综述及其延伸,入门必看!
  6. iOS 项目中添加字体库
  7. linux添加字体库
  8. 用计算机开方左右键,科学计算器开方怎么用(科学计算器开根号)
  9. 串联稳压电源与多谐振荡器
  10. kdj的matlab代码,8个字符的Kdj股票技术指标公式源代码(插图)