半平面交的板子

//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. 来说一说chrome扩展和chrome插件到底有什么区别?

    想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去搜索到chrome插件. 想讨论chrome ...

  2. https报错注销源文件内容

    open -a pycharm /Users/vivi/Library/Python/3.6/lib/python/site-packages/requests/packages/urllib3/co ...

  3. Jmeter逻辑控制器-ForEach Controller

    ForEach Controller 介绍 ForEach Contoller 即循环控制器,顾名思义是定义一个规则.主要有以下一个参数: 名称:随便填写 注释:随便填写 输入变量前缀:可以在&quo ...

  4. pandas处理各类表格数据

    经常遇到Python读取excel和csv还有其他各种文件的内容.json还有web端的读取还是比较简单,但是excel和csv的读写是很麻烦.这里记录了pandas库提供的方法来实现文本内容和Dat ...

  5. linux动态库加载路径修改

    1.在 /etc/ld.so.conf 文件中添加搜索路径,重启或者 ldconfig 生效: 2.在 /etc/ld.so.conf.d 目录下添加 *.conf 文件,其中可以添加搜索路径,重启获 ...

  6. sdibt 1244类似于拓扑排序

    博客:http://blog.csdn.net/mypsq/article/details/39005991 #include<stdio.h> #include<string.h& ...

  7. vim下多行注释与解注释

    1.多行注释 (1)按esc进入命令行模式 (2)按下Ctrl+v,进入区块模式,并使用上下键选择需要注释的多行 (3)按下“I”(大写)键,进入插入模式 (4)输入注释符(“//”或“#”等) (5 ...

  8. [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分

    Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...

  9. Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

    错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refre ...

  10. FreeMarker与Spring MVC 4集合的HelloWorld示例

    0.整体的项目结构 1.引入POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...