LA 3890 半平面交
二分查询答案,判断每一个新形成的向量合在一块能否形成半平面交
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 110
#define eps 1e-7 int dcmp(double x)
{
if(fabs(x)<eps) return ;
else return x<?-:;
} struct Point{
double x , y;
Point(double x= , double y=):x(x),y(y){}
}po[N] , poly[N]; typedef Point Vector;
Vector vec[N]; //记录每条边上对应的法向量 Vector operator+(Vector a , Vector b) { return Vector(a.x+b.x , a.y+b.y); }
Vector operator-(Point a , Point b) { return Vector(a.x-b.x , a.y-b.y); }
Vector operator*(Vector a , double b) { return Vector(a.x*b , a.y*b); }
Vector operator/(Vector a , double b) { return Vector(a.x/b , a.y/b); }
bool operator==(const Point &a , const Point &b) { return dcmp(a.x-b.x) == && dcmp(a.y-b.y) == ; } double Dot(Vector a , Vector b) { return a.x*b.x+a.y*b.y; }
double Cross(Vector a , Vector b) { return a.x*b.y - b.x*a.y; }
double Length(Vector a) { return sqrt(Dot(a,a)); }
double Angle(Vector A , Vector B) { return acos(Dot(A,B)) / Length(A) / Length(B); }
double Area2(Point A , Point B , Point C) { return Cross(B-A , C-A); } Vector Rotate(Vector A , double rad) { return Vector(A.x*cos(rad)-A.y*sin(rad) , A.x*sin(rad)+A.y*cos(rad)); } Vector Normal(Vector a)
{
double l = Length(a);
return Vector(-a.y/l , a.x/l);
} struct Line{
Point P;
Vector v;
double ang;
Line(){}
Line(Point P , Vector v):P(P),v(v){ang = atan2(v.y,v.x);}
bool operator<(const Line &m)const {
return ang<m.ang;
}
}line[N] , L[N]; bool OnLeft(Line L , Point P)
{
return Cross(L.v , P-L.P) > ;
} Point GetIntersection(Line a , Line b)
{
Vector u = a.P-b.P;
double t = Cross(b.v , u) / Cross(a.v , b.v);
return a.P+a.v*t;
} /***半平面交的主过程,返回形成半平面交点的个数,无法形成就返回0***/
int HalfplaneIntersection(Line *L , int n , Point *poly)
{
sort(L , L+n);
int first , last;
Point *p = new Point[n];
Line *q = new Line[n];
q[first=last=] = L[];
for(int i= ; i<n ; i++)
{
while(first<last && !OnLeft(L[i] , p[last-])) last--;
while(first<last && !OnLeft(L[i] , p[first])) first++;
q[++last] = L[i];
if(fabs(Cross(q[last].v , q[last-].v)) < eps)
{
last--;
if(OnLeft(q[last] , L[i].P)) q[last]=L[i];
}
if(first<last) p[last-] = GetIntersection(q[last-] , q[last]);
}
while(first < last && !OnLeft(q[first] , p[last-])) last--;
//删除无用平面
if(last-first<=) return ;
p[last] = GetIntersection(q[last] , q[first]); //从deque复制到输出中
int m=;
for(int i=first ; i<=last ; i++) poly[m++] = p[i];
return m;
} int main()
{
// freopen("a.in" , "r" , stdin);
int n;
while(scanf("%d" , &n) , n)
{
for(int i= ; i<n ; i++)
scanf("%lf%lf" , &po[i].x , &po[i].y); for(int i= ; i<n ; i++) vec[i] = Normal(po[(i+)%n]-po[i]);
double l= , r=;
while(r-l>eps){
double m=(l+r)/;
for(int i= ; i<n ; i++) L[i] = Line(po[i]+vec[i]*m , po[(i+)%n]-po[i]);
if(HalfplaneIntersection(L , n , poly)>) l=m;
else r=m;
}
printf("%.6f\n" , l);
}
return ;
}
LA 3890 半平面交的更多相关文章
- LA 2218 半平面交
题目大意:n名选手参加铁人三项赛,比赛按照选手在三个赛段中所用的总时间排定名次.已知每名选手在三个项目中的速度Ui.Vi.Wi.问对于选手i,能否通过适当的安排三个赛段的长度(但每个赛段的长度都不能 ...
- 【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个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
- bzoj2618[Cqoi2006]凸多边形 半平面交
这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...
- POJ 3384 Feng Shui 半平面交
题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...
- BZOJ2618[Cqoi2006]凸多边形——半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...
- 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)
洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...
随机推荐
- R 关于全局变量
不得不吐槽了 写了这么多,竟然今天才发现R的全局变量在函数名空间里是不能赋值的,我去!!! 就是说在函数里面,全局变量名是可读的,但不可写(写的时候 又会创建新的 自由变量了)
- 迭代器———更锋利的C#代码小记(3)
直接使用yield return关键字通过类似返回值的方式灵活地构造迭代器 public class EmployeeCollection :IEnumerable<Employee> { ...
- Git之fatal: remote origin already exists
文件提交到远程分支,我们需要提前表明需要提交到哪个远程分支 比如:git remote add origin git@github.com:wqk66/test.git,表示他提交到远程仓库test ...
- .htaccess重写规则失败
开启mod_rewrite.so LoadModule rewrite_module libexec/apache2/mod_rewrite.so 重启服务 sudo apachectl restar ...
- Django 路由 —— Djangon如何处理一个请求
Django URL路由概述 一个干净优雅的URL方案是高质量Web应用程序中的一个重要细则Django可以让你设计URL,无论你想要什么,没有框剪限制要为应用程序设计URL,您可以非正式地创建一个名 ...
- docker环境安装
centos7安装docker环境 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 ...
- SoapUI对于Json数据进行属性值获取与传递
SoapUI的Property Transfer功能可以很好地对接口请求返回的数据进行参数属性获取与传递,但对于Json数据,SoapUI会把数据格式先转换成XML格式,但实际情况却是,转换后的XML ...
- mongodb windows 开机启动
1)新建存放db E:\mongodb\data\db 2)新建日志文件 E:\mongodb\logs\log.txt 3)管理员运行Cmd 4)CD mongodb安装路径 5)运行命令 mong ...
- Word转html并移植到web项目
1.打开对应word文件 建议使用web视图查看文档 这样可以提前预览转转成html样式 2.如果有图片修改图片大小及格式 在web视图下,把图片调制适当大小,不然导出的html可能图片较小 3.点击 ...
- viewport移动端适配,读文笔记
文章地址: viewport移动端适配 笔记: 移动端适配目的: 希望在屏幕尺寸大小不同的手机上进行访问页面时,页面显示的效果能合理的展示,我们期望的是在手机屏幕较大时显示的内容比较大一些,手机屏幕小 ...