UVALive7461 - Separating Pebbles 判断两个凸包相交
- //UVALive7461 - Separating Pebbles 判断两个凸包相交
- #include <bits/stdc++.h>
- using namespace std;
- #define LL long long
- typedef pair<int,int> pii;
- const int inf = 0x3f3f3f3f;
- const int N =1e5+;
- #define clc(a,b) memset(a,b,sizeof(a))
- const double eps = 1e-;
- const int MOD = 1e9+;
- void fre() {freopen("in.txt","r",stdin);}
- void freout() {freopen("out.txt","w",stdout);}
- 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;}
- int sgn(double x) {
- if(fabs(x) < eps)return ;
- if(x < )return -;
- else return ;
- }
- struct Point {
- int x,y;
- Point() {}
- Point(int _x,int _y) {
- x = _x;
- y = _y;
- }
- Point operator -(const Point &b)const {
- return Point(x - b.x,y - b.y);
- }
- int operator ^(const Point &b)const {
- return x*b.y - y*b.x;
- }
- int operator *(const Point &b)const {
- return x*b.x + y*b.y;
- }
- friend int dis2(Point a) {
- return a.x*a.x+a.y*a.y;
- }
- friend bool operator<(const Point &a,const Point &b){
- if(fabs(a.y-b.y)<eps) return a.x<b.x;
- return a.y<b.y;
- }
- };
- typedef Point Vector;
- double Dot(Point A, Point B){return A.x*B.x+A.y*B.y;}//点积
- double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}//叉积
- double Length(Vector A){return sqrt(Dot(A,A));}//OA长
- double Angle(Point A,Point B){return acos(Dot(A,B)/Length(A)/Length(B));}//OA和OB的夹角
- //判断线段相交,不在端点相交
- bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2){
- 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);
- return sgn(c1)*sgn(c2)<&&sgn(c3)*sgn(c4)<;
- }
- int graham(Point p[],int n,Point q[]){
- int top=;
- sort(p,p+n);
- if(n==) return ;
- q[]=p[];
- if(n==) return ;
- q[]=p[];
- if(n==) return ;
- q[]=p[];
- for(int i=;i<n;i++){
- while(top&&(Cross(q[top]-q[top-],p[i]-q[top-])<=)) top--;
- q[++top]=p[i];
- }
- int len=top;
- q[++top]=p[n-];
- for(int i=n-;i>=;i--){
- while(top!=len&&(Cross(q[top]-q[top-],p[i]-q[top-])<=)) top--;
- q[++top]=p[i];
- }
- return top;
- }
- bool C_S(Point *ch1,int t1,Point *ch2,int t2)//判断凸包是否相交
- {
- double angle[],x;
- int i,j,k,m;
- if(t1==)return true;
- if(t1==)
- {
- for(i=;i<t2;i++)
- {
- k=sgn(Cross(ch1[]-ch1[],ch2[i]-ch1[]));
- if(k==&&Dot(ch1[]-ch1[],ch2[i]-ch1[])>)
- {
- if(Length(ch2[i]-ch1[])<Length(ch1[]-ch1[]))break;
- }
- }
- if(i<t2)return false;
- if(t2==&&SegmentProperIntersection(ch1[],ch1[],ch2[],ch2[]))return false;
- return true;
- }
- angle[]=;
- for(i=;i<t1;i++)
- angle[i-]=Angle(ch1[]-ch1[],ch1[i]-ch1[]);
- for(i=;i<t2;i++)
- {
- j=sgn(Cross(ch1[]-ch1[],ch2[i]-ch1[]));
- if(j<||(j==&&Dot(ch1[]-ch1[],ch2[i]-ch1[])<))continue;
- j=sgn(Cross(ch1[t1-]-ch1[],ch2[i]-ch1[]));
- if(j>||(j==&&Dot(ch1[t1-]-ch1[],ch2[i]-ch1[])<))continue;
- x=Angle(ch1[]-ch1[],ch2[i]-ch1[]);
- m=lower_bound(angle,angle+t1-,x)-angle;
- if(m==)j=;
- else j=m-;
- k=sgn(Cross(ch1[j+]-ch2[i],ch1[j+]-ch2[i]));
- if(k>=)break;
- }
- if(i<t2)return false;
- return true;
- }
- Point p1[],p2[],ch1[],ch2[];
- int main(){
- int T;
- scanf("%d",&T);
- while(T--){
- int n;
- scanf("%d",&n);
- int cnt1=,cnt2=;
- for(int i=;i<n;i++){
- int x,y,c;
- scanf("%d%d%d",&x,&y,&c);
- if(c==){
- p1[cnt1++]=Point(x,y);
- }
- else p2[cnt2++]=Point(x,y);
- }
- int t1=graham(p1,cnt1,ch1);
- int t2=graham(p2,cnt2,ch2);
- if(C_S(ch1,t1,ch2,t2)&&C_S(ch2,t2,ch1,t1)) printf("1\n");
- else printf("0\n");
- }
- }
UVALive7461 - Separating Pebbles 判断两个凸包相交的更多相关文章
- 如何判断单链表是否存在环 & 判断两链表是否相交
给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...
- UVa 10256 (判断两个凸包相离) The Great Divide
题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...
- 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 ...
- Pick-up sticks--poj2653(判断两线段是否相交)
http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍 一同洒在地上 求在最上面的棍子有那几个 分析: 我刚开始想倒着遍历 因为n是100000 想着会 ...
- NYOJ 1016 判断两线段是否相交
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #inc ...
- HDU 6590 Code (判断凸包相交)
2019 杭电多校 1 1013 题目链接:HDU 6590 比赛链接:2019 Multi-University Training Contest 1 Problem Description Aft ...
- 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 ...
- 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 ...
- UVa 10256 - The Great Divide 判断凸包相交
模板敲错了于是WA了好几遍…… 判断由红点和蓝点分别组成的两个凸包是否相离,是输出Yes,否输出No. 训练指南上的分析: 1.任取红凸包上的一条线段和蓝凸包上的一条线段,判断二者是否相交.如果相交( ...
随机推荐
- flex上下、左右居中
tip:1)flex是用于div布局用的,作用于一级子元素(父元素写样式,作用于子元素) 2)弹性盒模型 3)英文解释justify-content: 对齐内容(内容一般写在主轴上)align-ite ...
- Java对图片压缩
背景:图片上传服务器时候的大小限制取消之后,上传图片太大导致前台显示加载缓慢 需求:服务器对接收到的图片进行压缩 方法:1.上传后的文件保存在临时文件夹“/usr/upload/tmp” 2.压 ...
- Stack,ArrayDeque,LinkedList的区别
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 这段时间把疯狂JAVA再看了一遍,发现Stac ...
- python xlwt设置单元格的自定义背景颜色
我使用python 2.7和xlwt模块进行excel导出 我想设置我知道可以使用的单元格的背景颜色 style1 = xlwt.easyxf('pattern: pattern solid, for ...
- 54-Ubuntu-打包压缩-4-bzip2压缩和解压缩介绍
bzip2 tar和bizp2命令结合可以实现文件打包和压缩 tar只负责打包,但不压缩 用bzip2压缩tar打包后的文件,其扩展名一般为xxx.tar.bz2 在tar命令有一个选项-j可以调用b ...
- Quartz CronTrigger 整配置说明
Quartz cron 表达式的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级. Quartz用cron 表达式存放执行计划,引用了cron表达式的CronTrigger在计 ...
- 借用数组对象的prototype给数组扩充降维方法
原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...
- keras 或 tensorflow 调用GPU报错:Blas GEMM launch failed
GPU版的tensorflow在模型训练时遇到Blas GEMM launch failed错误,或者keras遇到相同错误(keras 一般将tensorflow作为backend,如果安装了GPU ...
- Vue报错type check failed for prop
在报错的'value'属性前面加:或者去掉:即可解决问题.
- 关于ajax请求status 200 却进入error 回调函数或显示跨域问题的解决方案及原因
这虽然不是前端的问题吧,但如果遇到那种不靠谱的后台 还是可以拿来打脸的 转:https://segmentfault.com/a/1190000012469713