BZOJ 1137 半平面交
半平面交的板子
//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 半平面交的更多相关文章
- BZOJ 1137: [POI2009]Wsp 岛屿 半平面交
1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 165 Solved: ...
- bzoj 4445 小凸想跑步 - 半平面交
题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...
- bzoj 3190 赛车 半平面交
直接写的裸的半平面交,已经有点背不过模板了... 这题卡精度,要用long double ,esp设1e-20... #include<iostream> #include<cstd ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交
发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- poj3335 半平面交
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
- POJ3525 半平面交
题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...
- POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交
题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
随机推荐
- 爬楼梯,N级楼梯有多少种走法?
https://blog.csdn.net/tcpipstack/article/details/45173685 一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,要求编写程序,求总共有 ...
- java之比较两个日期大小----https://blog.csdn.net/dongfangbaiyun/article/details/51225469
https://blog.csdn.net/dongfangbaiyun/article/details/51225469 java之比较两个日期大小 最近又用到两个日期大小的比较,因此记录在此,方便 ...
- 零基础到架构师 不花钱学JavaEE(基础篇)- 概述
Java简单来说是一门语言,Java能干什么? 网站:开发大,中,小型网站. 服务器端程序:企业级程序开发. APP:Android的APP基本使用Java开发. 云:Hadoop就是使用Java语言 ...
- ace & web ide & web code editor
ace & web ide & web code editor web ide https://ace.c9.io/ https://github.com/ajaxorg/ace ht ...
- 中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射
前文中文编程:中文命名之Hibernate 4+MySQL演示最后留下了个Hibernate 5之后出现的问题, 于是在Hibernate社区提交了报告: Seemingly regression s ...
- ScrollView双击图片定点放大
直接先说原理吧--原理:利用了scrollview的回调函数(如下)以及scrollview自己内部的一些缩放规则(其实我也还没弄清楚具体scrollview干了什么事),只是知道了它可以怎么做-_- ...
- one troubleshooting case about em access issue
Today when trying to open my Oracle EM url, I can not open it. So I thought may be the network is ha ...
- linux sed 命令的用法
原文 http://blog.chinaunix.net/uid-24426415-id-77244.html ------------------------------------------- ...
- Java推断和检查网络
在实践项目中.常常要处理网络异常等问题.为此,专门设计一个类,随时能够使用. import java.io.IOException; import java.net.InetAddress; impo ...
- sqlite 数据库 相关知识
一基本简单介绍 SQLite 是一个自持的(self-contained).无server的.零配置的.事务型的关系型数据库引擎.由于他非常小,所以也能够作为嵌入式数据库内建在你的应用程序中. SQL ...