半平面交的板子

//By SiriusRen
#include <bits/stdc++.h>
#define double long double
using namespace std;
const int N=;
const double eps=1e-;
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)>;
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)<;
}
void bpmj(){
sort(line+,line++tot);
n=;
for(int i=;i<=tot;i++){
if(abs(line[i].angle-line[i-].angle)>eps)n++;
line[n]=line[i];
}
int r=,l=;
q[]=line[],q[]=line[];
for(int i=;i<=n;i++){
while(l<r&&judge(q[r],q[r-],line[i]))r--;
while(l<r&&judge(q[l],q[l+],line[i]))l++;
q[++r]=line[i];
}
while(l<r&&judge(q[r],q[r-],q[l]))r--;
while(l<r&&judge(q[l],q[l+],q[r]))l++;
q[r+]=q[l],tot=;
for(int i=l;i<=r;i++)point[++tot]=inter(q[i],q[i+]);
point[++tot]=point[];
for(int i=;i<tot;i++)Ans+=dis(point[i],point[i+]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%Lf%Lf",&point[i].x,&point[i].y);
Ans=-dis(point[],point[n]);
for(int i=;i<=m;i++){
scanf("%d%d",&xx,&yy);
if(xx>yy)swap(xx,yy);
vec[xx].push_back(yy);
}
for(int i=,j,k;i<=n;i++){
sort(vec[i].begin(),vec[i].end());
for(j=n,k=vec[i].size()-;j>i&&~k;j--,k--)
if(vec[i][k]!=j)break;
if(i==&&j==n){printf("%.10Lf\n",dis(point[],point[n]));return ;}
if(j>i)addline(line[++tot],point[j],point[i]);
}addline(line[++tot],point[],point[n]);
bpmj();
printf("%.10Lf\n",Ans);
}

BZOJ 1137 半平面交的更多相关文章

  1. BZOJ 1137: [POI2009]Wsp 岛屿 半平面交

    1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 165  Solved: ...

  2. bzoj 4445 小凸想跑步 - 半平面交

    题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...

  3. bzoj 3190 赛车 半平面交

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

  4. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

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

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

  6. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  7. poj3335 半平面交

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

  8. POJ3525 半平面交

    题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...

  9. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

随机推荐

  1. 第九节:web爬虫之urllib(五)

    第四个模块 robotparser: 主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少.

  2. SpringMVC中@Controller和@RequestMapping用法和其他常用注解(转)

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  3. Spring核心技术(一)——IoC容器和Bean简介

    IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对 ...

  4. 备用交换机(cogs 8)

    [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接.因电子设备容易损坏,需给通讯点配备备用交换机.但备用交换机数量有限,不能全部配备,只能给部分重要城市配置.于是规 ...

  5. 进入DRF和ANGULAR的整合学习,这三篇入门内容一定要学好的

    看来,DJANGO的模板功能是无法用啦, 学着用ANGLUAR的SERVICE,MODULE,CONTROLLER啦... http://engineroom.trackmaven.com/blog/ ...

  6. Ubuntu 16.04下Markdown编辑器Haroopad

    1.下载deb包 地址:https://bitbucket.org/rhiokim/haroopad-download/downloads/haroopad-v0.13.2-x64.deb 这里是历史 ...

  7. 时间插件,js格式化,js某月天数,js某月最后一天日期

    //时间格式化 Date.prototype.format = function(fmt) { var o = { "M+": this.getMonth() + 1, //月份 ...

  8. ADO连接ACCESS2007及以上版本的数据库

    function getaccessstr(databasename:string;password:string;accessVer:string='access2003'):string; beg ...

  9. zookeeper+kafka配置

    ZooKeeper 安装 #将ZooKeeper解压到/usr/local中 tar –zxvf zookeeper-3.4.6.tar.gz –C /usr/local cd /usr/local ...

  10. python基础练习-猜年龄、编写登陆接口小程序

    python基础练习:   一.猜年龄 , 可以让用户最多猜三次! age=40 count = 1 while count <=3 : user_guess=int(input("i ...