求简单多边形内的最长线段长度

显然存在一组最优解,使其所在直线经过多边形的两个端点,枚举这两个端点,求出直线和多边形的有效交点,从而得出直线有哪些部分在多边形内(含边界)。

由于多边形的一些边可能与直线重合,求交需要一些分类讨论。

#include<bits/stdc++.h>
typedef long long i64;
typedef double ld;
struct pos{
int x,y;
ld abs(){return sqrt(i64(x)*x+i64(y)*y);}
}ps[];
pos operator-(const pos&a,const pos&b){return (pos){a.x-b.x,a.y-b.y};}
i64 operator*(const pos&a,const pos&b){return i64(a.x)*b.y-i64(a.y)*b.x;}
int sgn(i64 x){return x<?-:x>;}
int n,t[],kp;
ld ans=,ks[];
void maxs(ld&x,ld y){if(x<y)x=y;}
#define F(a) ps[a]*ps[a+1]/ld(p*(ps[a+1]-ps[a]))*pl
void chk(pos p){
kp=;
ld pl=p.abs();
for(int i=;i<n+;++i)t[i]=sgn(p*ps[i]);
for(int i=,z;i<n;++i)if(t[i]&&t[i]!=t[i+]){
for(z=i+;!t[z];++z);
if(t[z]!=t[i]){
if(z-i<)ks[kp++]=F(i);
else{
ld a0=F(i),a1=F(z-);
ks[kp++]=(a0<a1)==(t[i]>)?a0:a1;
}
}else if(z-i==){
ld a0=F(i),a1=F(z-);
if((a0<a1)==(t[i]>))maxs(ans,fabs(a1-a0));
}
}
std::sort(ks,ks+kp);
for(int i=;i<kp;i+=)maxs(ans,ks[i+]-ks[i]);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;++i)scanf("%d%d",&ps[i].x,&ps[i].y);
for(int i=;i<n;++i){
pos o=ps[i];
for(int j=;j<n;++j)ps[j]=ps[j]-o;
for(int j=;j<;++j)ps[n+j]=ps[j];
for(int j=i+;j<n;++j)chk(ps[j]);
}
printf("%.8f",ans);
return ;
}

bzoj4948: World Final2017 A的更多相关文章

随机推荐

  1. linux通过安装包安装nginx和jdk

    1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...

  2. Python的函数基础

    引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...

  3. 依赖注入的方式测试ArrayList和LinkedList的效率(对依赖注入的再次理解)

    9/20 号再进行学习 在C++中,main函数尽可能的简单,只要调用子函数的一句话就实现了功能. java开发中,controller就相同于是main函数,其他类的方法不在本类中时候, 1.可以用 ...

  4. Python——psutil的使用(获取系统性能信息)

    >>> import psutil #导入psutil >>> a=psutil.virtual_memory() >>> a.total #总虚 ...

  5. linux内核入门(1)——基本简介和编译

    获取linux内核源码,自己选择版本(我下载的是linux-3.1.10.tar.gz ,我是直接下载到/usr/src文件夹的) 下载地址传送门 https://www.kernel.org/pub ...

  6. .NET本质论 方法

    方法和JIT编译 CLR只执行本机的机器代码.如果一个方法体由CIL组成,那么它就必须在调用之前被转换为本机的机器码(将MSIL编译为本机代码,运行库提供了两种方式.一种就是在安装与部署时的预编译(由 ...

  7. java_架构与模式

    框架有哪些?C++语言的QT.MFC.gtk,Java语言的SSH,php语言的 smarty(MVC模式),python语言的django(MTV模式)等等设计模式有哪些?工厂模式.适配器模式.策略 ...

  8. DNS压力测试

    安装 queryperf cd /usr/local/src wget http://ftp.isc.org/isc/bind9/9.12.1/bind-9.12.1.tar.gz 编译querype ...

  9. SQL Server 数值四舍五入,小数点后保留2位

    1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位. 2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后 ...

  10. RedHat如何关闭防火墙

    1.查看防火墙是否已开启 #可以查看到iptables服务的当前状态. service iptables status​ 上图表示防火墙已关闭. 2.关闭防火墙 关闭防火墙的方法为:   1)永久性生 ...