半平面交的板子

//By SiriusRen
#include <bits/stdc++.h>
#define double long double
using namespace std;
const int N=100050;
const double eps=1e-10;
int n,m,xx,yy,tot;
double Ans;
vector<int>vec[N];
struct Point{double x,y;}point[N];
struct Line{Point a,b;double angle;}line[N],q[N];
void addline(Line &l,Point a,Point b){l.a=a,l.b=b,l.angle=atan2(b.y-a.y,b.x-a.x);
}
Point operator-(Point a,Point b){Point c;c.x=a.x-b.x,c.y=a.y-b.y;return c;
}
double operator*(Point a,Point b){return a.x*b.y-a.y*b.x;
}
bool operator<(Line a,Line b){if(a.angle==b.angle)return (b.b-a.a)*(b.a-a.a)>0;return a.angle<b.angle;
}
Point inter(Line a,Line b){double k1,k2,t;k1=(a.b-b.a)*(b.b-b.a);k2=(b.b-b.a)*(a.a-b.a);t=k1/(k1+k2);Point ans;ans.x=a.b.x+(a.a.x-a.b.x)*t;ans.y=a.b.y+(a.a.y-a.b.y)*t;return ans;
}
double dis(Point x,Point y){x=y-x;return sqrt(x.x*x.x+x.y*x.y);
}
bool judge(Line a,Line b,Line t){Point p=inter(a,b);return (t.a-p)*(t.b-p)<0;
}
void bpmj(){sort(line+1,line+1+tot);n=0;for(int i=1;i<=tot;i++){if(abs(line[i].angle-line[i-1].angle)>eps)n++;line[n]=line[i];}int r=1,l=0;q[0]=line[1],q[1]=line[2];for(int i=3;i<=n;i++){while(l<r&&judge(q[r],q[r-1],line[i]))r--;while(l<r&&judge(q[l],q[l+1],line[i]))l++;q[++r]=line[i];}while(l<r&&judge(q[r],q[r-1],q[l]))r--;while(l<r&&judge(q[l],q[l+1],q[r]))l++;q[r+1]=q[l],tot=0;for(int i=l;i<=r;i++)point[++tot]=inter(q[i],q[i+1]);point[++tot]=point[1];for(int i=1;i<tot;i++)Ans+=dis(point[i],point[i+1]);
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%Lf%Lf",&point[i].x,&point[i].y);Ans=-dis(point[1],point[n]);for(int i=1;i<=m;i++){scanf("%d%d",&xx,&yy);if(xx>yy)swap(xx,yy);vec[xx].push_back(yy);}for(int i=1,j,k;i<=n;i++){sort(vec[i].begin(),vec[i].end());for(j=n,k=vec[i].size()-1;j>i&&~k;j--,k--)if(vec[i][k]!=j)break;if(i==1&&j==n){printf("%.10Lf\n",dis(point[1],point[n]));return 0;}if(j>i)addline(line[++tot],point[j],point[i]);}addline(line[++tot],point[1],point[n]);bpmj();printf("%.10Lf\n",Ans);
}

转载于:https://www.cnblogs.com/SiriusRen/p/6898975.html

BZOJ 1137 半平面交相关推荐

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

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

  2. bzoj 3190 赛车 半平面交

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

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

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

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

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

  5. poj3335 半平面交

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

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

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

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

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

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

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

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

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

最新文章

  1. openstack e版创建instance整个流程
  2. docker 挂载主机目录访问报错Permission denied 解决办法
  3. 怎么开启JavaScript ?
  4. openstack--1--基础环境搭建
  5. 我们需要什么样的恐怖小说?
  6. python socket connection_Python socket.create_connection方法代码示例
  7. 2019年,有远见的程序员都在关注这些硬核公众号
  8. 怎么查看自己电脑是否被安装远程监控
  9. Linux面试题(总结最全面的面试题!!!)
  10. Android --Gson解析json数据
  11. 电路串联和并联图解_串联和并联的电路图怎么画
  12. python对数据进行分类_按Python对数据进行分类
  13. 华为正式发布鸿蒙 2.0,更新人数太多挤爆服务器,P50 也官宣了!
  14. c 语言字符型转换为整形,高楼平地起!C语言数据的两种类型转换
  15. 解决:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING
  16. 聚合支付怎么样 如何成为推广员
  17. WINDOWS服务器性能监控器的监视以及邮件预警配置
  18. 【Typora】自动生成markdown文档目录
  19. 继京东美团后,腾讯派发快手5116万股:价值26亿港元
  20. 生信入门(二)——使用limma、Glimma和edgeR,RNA-seq数据分析

热门文章

  1. 推荐一个配置linux服务的网站
  2. PHP商城数据库安全事务处理方法
  3. PS图片后期之超简易造光调色方法
  4. 一文搞懂:词法作用域、动态作用域、回调函数、闭包
  5. openssl、ssh
  6. Idea的一些调试技巧及设置todo
  7. Win10 IIS本地部署网站运行时图片和样式不正常?
  8. Linux下Chromium使用flash的办法
  9. Exchange企业实战技巧(26)在Outlook中打开多个邮箱
  10. Web安全渗透测试之信息搜集篇(上)