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+;
  9. #define clc(a,b) memset(a,b,sizeof(a))
  10. const double eps = 1e-;
  11. const int MOD = 1e9+;
  12. void fre() {freopen("in.txt","r",stdin);}
  13. void freout() {freopen("out.txt","w",stdout);}
  14. inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;}
  15.  
  16. int sgn(double x) {
  17. if(fabs(x) < eps)return ;
  18. if(x < )return -;
  19. else return ;
  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)<&&sgn(c3)*sgn(c4)<;
  55. }
  56.  
  57. int graham(Point p[],int n,Point q[]){
  58. int top=;
  59. sort(p,p+n);
  60. if(n==) return ;
  61. q[]=p[];
  62. if(n==) return ;
  63. q[]=p[];
  64. if(n==) return ;
  65. q[]=p[];
  66. for(int i=;i<n;i++){
  67. while(top&&(Cross(q[top]-q[top-],p[i]-q[top-])<=)) top--;
  68. q[++top]=p[i];
  69. }
  70. int len=top;
  71. q[++top]=p[n-];
  72. for(int i=n-;i>=;i--){
  73. while(top!=len&&(Cross(q[top]-q[top-],p[i]-q[top-])<=)) 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[],x;
  82. int i,j,k,m;
  83. if(t1==)return true;
  84. if(t1==)
  85. {
  86. for(i=;i<t2;i++)
  87. {
  88. k=sgn(Cross(ch1[]-ch1[],ch2[i]-ch1[]));
  89. if(k==&&Dot(ch1[]-ch1[],ch2[i]-ch1[])>)
  90. {
  91. if(Length(ch2[i]-ch1[])<Length(ch1[]-ch1[]))break;
  92. }
  93. }
  94. if(i<t2)return false;
  95. if(t2==&&SegmentProperIntersection(ch1[],ch1[],ch2[],ch2[]))return false;
  96. return true;
  97. }
  98. angle[]=;
  99. for(i=;i<t1;i++)
  100. angle[i-]=Angle(ch1[]-ch1[],ch1[i]-ch1[]);
  101. for(i=;i<t2;i++)
  102. {
  103. j=sgn(Cross(ch1[]-ch1[],ch2[i]-ch1[]));
  104. if(j<||(j==&&Dot(ch1[]-ch1[],ch2[i]-ch1[])<))continue;
  105. j=sgn(Cross(ch1[t1-]-ch1[],ch2[i]-ch1[]));
  106. if(j>||(j==&&Dot(ch1[t1-]-ch1[],ch2[i]-ch1[])<))continue;
  107. x=Angle(ch1[]-ch1[],ch2[i]-ch1[]);
  108. m=lower_bound(angle,angle+t1-,x)-angle;
  109. if(m==)j=;
  110. else j=m-;
  111. k=sgn(Cross(ch1[j+]-ch2[i],ch1[j+]-ch2[i]));
  112. if(k>=)break;
  113. }
  114. if(i<t2)return false;
  115. return true;
  116. }
  117.  
  118. Point p1[],p2[],ch1[],ch2[];
  119. int main(){
  120. int T;
  121. scanf("%d",&T);
  122. while(T--){
  123. int n;
  124. scanf("%d",&n);
  125. int cnt1=,cnt2=;
  126. for(int i=;i<n;i++){
  127. int x,y,c;
  128. scanf("%d%d%d",&x,&y,&c);
  129. if(c==){
  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. }

UVALive7461 - Separating Pebbles 判断两个凸包相交的更多相关文章

  1. 如何判断单链表是否存在环 & 判断两链表是否相交

    给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...

  2. UVa 10256 (判断两个凸包相离) The Great Divide

    题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...

  3. You can Solve a Geometry Problem too(判断两线段是否相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  4. Pick-up sticks--poj2653(判断两线段是否相交)

    http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个 分析:  我刚开始想倒着遍历  因为n是100000   想着会 ...

  5. NYOJ 1016 判断两线段是否相交

    #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #inc ...

  6. HDU 6590 Code (判断凸包相交)

    2019 杭电多校 1 1013 题目链接:HDU 6590 比赛链接:2019 Multi-University Training Contest 1 Problem Description Aft ...

  7. You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...

  8. hdu 1086:You can Solve a Geometry Problem too(计算几何,判断两线段相交,水题)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  9. UVa 10256 - The Great Divide 判断凸包相交

    模板敲错了于是WA了好几遍…… 判断由红点和蓝点分别组成的两个凸包是否相离,是输出Yes,否输出No. 训练指南上的分析: 1.任取红凸包上的一条线段和蓝凸包上的一条线段,判断二者是否相交.如果相交( ...

随机推荐

  1. flex上下、左右居中

    tip:1)flex是用于div布局用的,作用于一级子元素(父元素写样式,作用于子元素) 2)弹性盒模型 3)英文解释justify-content: 对齐内容(内容一般写在主轴上)align-ite ...

  2. Java对图片压缩

    背景:图片上传服务器时候的大小限制取消之后,上传图片太大导致前台显示加载缓慢 需求:服务器对接收到的图片进行压缩 方法:1.上传后的文件保存在临时文件夹“/usr/upload/tmp”    2.压 ...

  3. Stack,ArrayDeque,LinkedList的区别

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     这段时间把疯狂JAVA再看了一遍,发现Stac ...

  4. python xlwt设置单元格的自定义背景颜色

    我使用python 2.7和xlwt模块进行excel导出 我想设置我知道可以使用的单元格的背景颜色 style1 = xlwt.easyxf('pattern: pattern solid, for ...

  5. 54-Ubuntu-打包压缩-4-bzip2压缩和解压缩介绍

    bzip2 tar和bizp2命令结合可以实现文件打包和压缩 tar只负责打包,但不压缩 用bzip2压缩tar打包后的文件,其扩展名一般为xxx.tar.bz2 在tar命令有一个选项-j可以调用b ...

  6. Quartz CronTrigger 整配置说明

    Quartz cron 表达式的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级.  Quartz用cron 表达式存放执行计划,引用了cron表达式的CronTrigger在计 ...

  7. 借用数组对象的prototype给数组扩充降维方法

    原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...

  8. keras 或 tensorflow 调用GPU报错:Blas GEMM launch failed

    GPU版的tensorflow在模型训练时遇到Blas GEMM launch failed错误,或者keras遇到相同错误(keras 一般将tensorflow作为backend,如果安装了GPU ...

  9. Vue报错type check failed for prop

    在报错的'value'属性前面加:或者去掉:即可解决问题.

  10. 关于ajax请求status 200 却进入error 回调函数或显示跨域问题的解决方案及原因

    这虽然不是前端的问题吧,但如果遇到那种不靠谱的后台 还是可以拿来打脸的 转:https://segmentfault.com/a/1190000012469713