没有想到这个题可以转化成解方程组的形式,就像线性规划一样,觉得好神奇。《训练指南》上的解析挺详细的,就不写了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
const double eps=1e-8;
struct Point
{double x,y;Point(double x=0,double y=0):x(x),y(y) {}
};
typedef Point Vector;
struct DLine//有向直线directed line
{Point P;Vector v;double ang;DLine() {}DLine(Point P,Vector v):P(P),v(v){ang=atan2(v.y,v.x);}bool operator < (const DLine& L) const{return ang<L.ang;}
};Vector operator + (Vector A,Vector B)
{return Vector(A.x+B.x,A.y+B.y);
}
Vector operator - (Vector A,Vector B)
{return Vector(A.x-B.x,A.y-B.y);
}
Vector operator * (Vector A,double p)
{return Vector(A.x*p,A.y*p);
}
int dcmp(double x)
{if(fabs(x)<eps) return 0;else return x<0?-1:1;
}
bool operator == (const Point& a,const Point& b)//两点相等
{return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;
}
double Dot(Vector A,Vector B)
{return A.x*B.x+A.y*B.y;
}
double Length(Vector A)
{return sqrt(Dot(A,A));
}
double Cross(Vector A,Vector B)
{return A.x*B.y-A.y*B.x;
}
Vector Normal(Vector A)//向量的单位法线,即左转90度
{double L=Length(A);return Vector(-A.y/L,A.x/L);
}bool OnLeft(DLine L,Point p)//判断点p是否在有向直线L的左边
{return Cross(L.v,p-L.P)>0;
}
Point GetIntersection(DLine a,DLine b)//有向直线交点,假设交点唯一
{Vector u=a.P-b.P;double t=Cross(b.v,u)/Cross(a.v,b.v);return a.P+a.v*t;
}
int HalfPlaneIntersection(DLine* L,int n,Point* poly)//半平面交
{sort(L,L+n);int first,last;Point *p=new Point[n];DLine *q=new DLine[n];q[first=last=0]=L[0];for(int i=1;i<n;i++){while(first<last && !OnLeft(L[i],p[last-1])) last--;while(first<last && !OnLeft(L[i],p[first])) first++;q[++last]=L[i];if(fabs(Cross(q[last].v,q[last-1].v))<eps){last--;if(OnLeft(q[last],L[i].P)) q[last]=L[i];}if(first<last) p[last-1]=GetIntersection(q[last-1],q[last]);}while(first<last && !OnLeft(q[first],p[last-1])) last--;if(last-first <= 1) return 0;p[last]=GetIntersection(q[last],q[first]);int m=0;for(int i=first;i<=last;i++) poly[m++]=p[i];return m;
}
Point poly[maxn];
DLine L[maxn];
int V[maxn],U[maxn],W[maxn];
int main()
{int n;while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%d%d%d",&V[i],&U[i],&W[i]);for(int i=0;i<n;i++){int cnt=0,ok=1;double k=10000;for(int j=0;j<n;j++)if(i!=j){if(V[i]<=V[j] && U[i]<=U[j] && W[i]<=W[j]) {ok=0;break;}if(V[i]>=V[j] && U[i]>=U[j] && W[i]>=W[j]) continue;double a=(k/V[j]-k/W[j])-(k/V[i]-k/W[i]);double b=(k/U[j]-k/W[j])-(k/U[i]-k/W[i]);double c=k/W[j]-k/W[i];Point p=Point(-c/a,0);Vector v(b,-a);L[cnt++]=DLine(p,v);}if(ok){L[cnt++]=DLine(Point(0,0),Vector(0,-1));L[cnt++]=DLine(Point(0,0),Vector(1,0));L[cnt++]=DLine(Point(0,1),Vector(-1,1));if(!HalfPlaneIntersection(L,cnt,poly)) ok=0;}if(ok) printf("Yes\n");else printf("No\n");}}return 0;
}

View Code

转载于:https://www.cnblogs.com/54zyq/p/3236662.html

LA2218半平面交相关推荐

  1. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  2. poj3335 半平面交

    题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...

  3. bzoj 3190 赛车 半平面交

    直接写的裸的半平面交,已经有点背不过模板了... 这题卡精度,要用long double ,esp设1e-20... #include<iostream> #include<cstd ...

  4. BZOJ 1038: [ZJOI2008]瞭望塔 半平面交

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1 ...

  5. 计算几何学习之半平面交

    首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax ...

  6. [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交

    大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...

  7. 【POJ1474】监控摄像头 半平面交

    题目描述 一个著名的仓库管理公司SERKOI 请你为其安装一套闭路监视系统,由于SERKOI 财力有限,每个房间只能安装一台摄像机,不过其镜头可以向任何方向转换. 请你写一个程序,对于给定的房间示意图 ...

  8. [BZOJ1038]ZJOI2008瞭望塔|半平面交

    考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...

  9. BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交

    发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...

最新文章

  1. 关于automake 和 makefile 使用感受
  2. java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传
  3. ewomail 内部通讯_教你搭建自己的邮件服务器-Ubuntu 18.04下通过Docker使用EwoMail实现...
  4. 程序改错(递归函数):数字转字符
  5. python hadoop streaming_Hadoop Streaming 使用及参数设置
  6. js声明php变量,vue.js怎样声明变量
  7. 发现1个宝藏项目,GitHub上都没有的那种!
  8. cad线性标注命令_CAD的标注命令原来可以这样用,学了十几年,终于知道了
  9. Nginx代理服务器使用
  10. 【05】JSON笔记
  11. linux vi命令的查询,linux vi命令模式详解
  12. 收款收据设计html,最新收款收据模板的格式
  13. Python 爬虫实践:《战狼2》豆瓣影评分析
  14. js中的eval语法
  15. 内存耗用:VSS/RSS/PSS/USS 的介绍
  16. Unquotted string 错误
  17. Labelme标注的json数据转化为coco格式的数据
  18. 通过win32api与win32con模拟按键精灵爬取中国商标网数据
  19. 设置服务器项目用友,如何设置用友应用服务器配置
  20. 流程图头脑风暴类软件

热门文章

  1. 微信号承载私域流量的9条心得
  2. 都说“先卖人,后卖货”,或者说要想卖货,先卖人
  3. 计算机程序员能做多久,这个行业有年龄限制吗?
  4. 有钱人是怎么挣钱的?
  5. React和Vue的模块化
  6. From the data point of view
  7. 以太坊PoA共识引擎算法介绍(1)
  8. 金橙子打标软件学习流程
  9. URI、URL与URN【定义+联系】
  10. sql 生成csv数据_创建包含SQL Server数据的动态生成的CSV文件