bzoj4948: World Final2017 A
求简单多边形内的最长线段长度
显然存在一组最优解,使其所在直线经过多边形的两个端点,枚举这两个端点,求出直线和多边形的有效交点,从而得出直线有哪些部分在多边形内(含边界)。
由于多边形的一些边可能与直线重合,求交需要一些分类讨论。
#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的更多相关文章
随机推荐
- 20155208 实验四 Android开发基础
20155208 实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...
- Javascript中的Bind,Call和Apply
http://www.html-js.com/article/JavaScript-functional-programming-in-Javascript-Bind-Call-and-Apply?s ...
- cvtColor()学习
CvtColor Void cv::cvtColor(InputArray src, OutputArray dst, INT code, INT dstCn = ) 将图像从一个颜色空间转换为另一个 ...
- C++学习(二十八)(C语言部分)之 文件操作
复习:#define 定义一个宏#include 文件包含#if 条件防止头文件重复包含定义一个宏 判断宏是否定义 判断头文件是否包含#define _STDIO_H_#include<stdi ...
- C++学习(十二)(C语言部分)之 循环
上期回顾:分支if else switch 三目运算符 格式:if(条件){语句1:}else{语句2:} switch (变量){default:break;case 常量1:语句1 ;break; ...
- Python的函数基础
引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...
- oracle查询A表中主键都被哪些表引用了?
select r.TABLE_NAME from USER_CONSTRAINTS p, USER_CONSTRAINTS r where p.TABLE_NAME = 'IAM_AUDIT_FIND ...
- mac电脑读写NTFS格式的移动硬盘命令
diskutil info /Volumes/SAMSUNG | grep UUID echo "UUID=38EBE5E4-016F-44B7-9D55-BB4AF6DC3E1D none ...
- Java基础六(自定义类、ArrayList集合)
今日内容介绍1.自定义类型的定义及使用2.自定义类的内存图3.ArrayList集合的基本功能4.随机点名器案例及库存案例代码优化 ###01引用数据类型_类 * A: 数据类型 * a: java中 ...
- centos7部署phpipam(ip管理系统)
安装必要的软件 yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear php ...