LA2218半平面交
没有想到这个题可以转化成解方程组的形式,就像线性规划一样,觉得好神奇。《训练指南》上的解析挺详细的,就不写了。
#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半平面交相关推荐
- 【kuangbin专题】计算几何_半平面交
1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...
- poj3335 半平面交
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
- bzoj 3190 赛车 半平面交
直接写的裸的半平面交,已经有点背不过模板了... 这题卡精度,要用long double ,esp设1e-20... #include<iostream> #include<cstd ...
- BZOJ 1038: [ZJOI2008]瞭望塔 半平面交
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1 ...
- 计算几何学习之半平面交
首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax ...
- [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交
大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...
- 【POJ1474】监控摄像头 半平面交
题目描述 一个著名的仓库管理公司SERKOI 请你为其安装一套闭路监视系统,由于SERKOI 财力有限,每个房间只能安装一台摄像机,不过其镜头可以向任何方向转换. 请你写一个程序,对于给定的房间示意图 ...
- [BZOJ1038]ZJOI2008瞭望塔|半平面交
考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...
- BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交
发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...
最新文章
- 关于automake 和 makefile 使用感受
- java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传
- ewomail 内部通讯_教你搭建自己的邮件服务器-Ubuntu 18.04下通过Docker使用EwoMail实现...
- 程序改错(递归函数):数字转字符
- python hadoop streaming_Hadoop Streaming 使用及参数设置
- js声明php变量,vue.js怎样声明变量
- 发现1个宝藏项目,GitHub上都没有的那种!
- cad线性标注命令_CAD的标注命令原来可以这样用,学了十几年,终于知道了
- Nginx代理服务器使用
- 【05】JSON笔记
- linux vi命令的查询,linux vi命令模式详解
- 收款收据设计html,最新收款收据模板的格式
- Python 爬虫实践:《战狼2》豆瓣影评分析
- js中的eval语法
- 内存耗用:VSS/RSS/PSS/USS 的介绍
- Unquotted string 错误
- Labelme标注的json数据转化为coco格式的数据
- 通过win32api与win32con模拟按键精灵爬取中国商标网数据
- 设置服务器项目用友,如何设置用友应用服务器配置
- 流程图头脑风暴类软件