用一个圆心在(x,y)的圆环覆盖一个n边形,顺或逆时针给出n边形所有顶点,求圆环最小面积。

卡了好久,各种傻逼错误。。

题目就是让我们固定一大一小两个边界圆,我们来看看这两个圆满足什么条件。

首先外面的那个圆肯定是经过n边形的某个顶点,所以外圆半径就是最大的点距。

其次内圆呢,可能经过一个点,也可能与某条边相切,但注意,这里的线是线段不是直线!

所以可能会出现最后的内圆和某条“直线”相交而与其对应的线段没有交点。例如:

上图中内圆与四条“直线”都相交,但与“线段”只有一个交点。

为了判断内圆,我用了最粗暴的方法--二分,计算与当前半径的圆相交的“直线“的两个交点是否在“线段”上,用横坐标或纵坐标判断。

Trick:

如果是用y=kx+b就会wa,因为平面上不是所有的直线都能这么表示,要用一般式Ax+By+C=0。

计算圆与直线相交情况时记得分B是否为0的情况。所有计算过程中记得判断除0情况。

精度。二分时在精度那里要注意R-eps或者L+eps,不然可能tle。

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
//#include<iostream>
using namespace std; int n;
#define maxn 100011
struct Point
{
double x,y;
}a[maxn],P;
struct Line
{
double a,b,c,dis;
}l[maxn];
const double eps=1e-,pi=3.1415926535897932384626434;
void do_line(int id,double x1,double y1,double x2,double y2)
{
if (x1==x2)
{
l[id].a=;
l[id].b=;
l[id].c=-x1;
}
else if (y1==y2)
{
l[id].a=;
l[id].b=;
l[id].c=-y1;
}
else if (x2*y1==x1*y2)
{
l[id].c=;
l[id].a=;
if (y1) l[id].b=-x1/y1*l[id].a;
else l[id].b=-x2/y2*l[id].a;
}
else
{
l[id].c=;
l[id].a=l[id].c*(y2-y1)/(x2*y1-x1*y2);
l[id].b=l[id].c*(x2-x1)/(y2*x1-y1*x2);
}
l[id].dis=abs(l[id].a*P.x+l[id].b*P.y+l[id].c)/sqrt(l[id].a*l[id].a+l[id].b*l[id].b);
}
double ppdissqr(double x1,double y1,double x2,double y2)
{
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
bool judge(double x)
{
for (int i=;i<=n;i++)
if (l[i].dis-x<=-eps)
{
double A=l[i].a,B=l[i].b,C=l[i].c;
if (B)
{
double delta=((A/B)*(A/B)+)*x*x-((A*P.x+C)/B+P.y)*((A*P.x+C)/B+P.y),
x1=(-*(A/B*(C/B+P.y)-P.x)+sqrt(delta))/(*(+(A/B)*(A/B))),
x2=(-*(A/B*(C/B+P.y)-P.x)-sqrt(delta))/(*(+(A/B)*(A/B)));
double p=a[i].x,q=a[i+].x;
if (i==n) q=a[].x;
if (p>q) swap(p,q);
if ((x1>=p && x1<=q)
|| (x2>=p && x2<=q))
return ;
}
else
{
double y1=P.y+sqrt(x*x-(-C/A-P.x)*(-C/A-P.x)),
y2=P.y-sqrt(x*x-(-C/A-P.x)*(-C/A-P.x));
double p=a[i].y,q=a[i+].y;
if (i==n) q=a[].y;
if (p>q) swap(p,q);
if ((y1>=p && y1<=q)
|| (y2>=p && y2<=q))
return ;
}
}
return ;
}
int main()
{
scanf("%d%lf%lf",&n,&P.x,&P.y);
for (int i=;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
for (int i=;i<n;i++)
do_line(i,a[i].x,a[i].y,a[i+].x,a[i+].y);
do_line(n,a[n].x,a[n].y,a[].x,a[].y);
double f1=0.0,r2,L=0.0,R;
for (int i=;i<=n;i++)
f1=max(f1,ppdissqr(a[i].x,a[i].y,P.x,P.y));
R=sqrt(f1);
for (int i=;i<=n;i++)
R=min(R,sqrt(ppdissqr(a[i].x,a[i].y,P.x,P.y)));
while (R-L>eps)
{
double mid=(L+R+eps)/;
if (judge(mid)) L=mid;
else R=mid-eps;
}
r2=(L+R)/;
printf("%.10lf\n",pi*(f1-r2*r2));
return ;
}

CF613A:Peter and Snow Blower的更多相关文章

  1. Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何

    A. Peter and Snow Blower 题目连接: http://www.codeforces.com/contest/613/problem/A Description Peter got ...

  2. codeforce #339(div2)C Peter and Snow Blower

    Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...

  3. A. Peter and Snow Blower 解析(思維、幾何)

    Codeforce 613 A. Peter and Snow Blower 解析(思維.幾何) 今天我們來看看CF613A 題目連結 題目 給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆 ...

  4. [CodeForces - 614C] C - Peter and Snow Blower

    C - Peter and Snow Blower Peter got a new snow blower as a New Year present. Of course, Peter decide ...

  5. Codeforces Round #339 Div.2 C - Peter and Snow Blower

    Peter got a new snow blower as a New Year present. Of course, Peter decided to try it immediately. A ...

  6. 【14.36%】【codeforces 614C】Peter and Snow Blower

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. 【CodeForces 613A】Peter and Snow Blower

    题 题意 给出原点(不是(0,0)那个原点)的坐标和一个多边形的顶点坐标,求多边形绕原点转一圈扫过的面积(每个顶点到原点距离保持不变). 分析 多边形到原点的最小距离和最大距离构成的两个圆之间的圆环就 ...

  8. codeforces 613A. Peter and Snow Blower

    题目链接 给一个多边形, 一个多边形外的定点, 求这个点距离多边形的最短距离和最长距离. 最长距离肯定是和某个顶点的连线, 而最短距离是和点的连线或是和某条边的连线. 对于一条边上的两个点a, b, ...

  9. CodeForces 614C Peter and Snow Blower

    简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可 #include<cstdio> #include<cstring> #include<cmath> ...

随机推荐

  1. 转 Java 208道面试题及部分答案 补充部分答案

    转自https://www.cnblogs.com/chen1005/p/10481102.html   ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE ...

  2. expect下命令不能解析通配符*的问题

    曾遇到这样一段代码:(Bash脚本) 1 2 3 4 5 6 7 8 9 10 11 12 #!/usr/bin/expect -f set HOST "192.168.102.1" ...

  3. web前端怎么样才能入门

    web前端怎么样才能入门,首先我们要从什么是初级web前端工程师说起: 按照我的想法,我把前端工程师分为了入门.初级.中级.高级这四个级别: 入门级别指的是了解什么是前端(前端到底是什么其实很多人还是 ...

  4. B/S网络架构

    B/S基于统一的应用层协议HTTP来交互数据,目前的B/S网络架构大多采用如图所示的架构设计,既要满足海量用户访问请求,又要保持用户请求的快速响应. 当一个用户在浏览器输入www.taobao.com ...

  5. IF-MIB::ifTable = No Such Object available on this agent at this OID

    在server端口执行如下命令 [root@localhost ~]# snmpwalk -v2c -c public 客户端ip ifIF-MIB::ifTable = No Such Object ...

  6. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  7. 基于 python 的接口测试框架

    项目背景 公司内部的软件采用B/S架构,管理实验室数据,实现数据的存储和分析统计.大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,之前尝试过用python+selenium进行UI ...

  8. SQLite-删除查询

    SQLite -删除查询 SQLite DELETE查询用于从一个表删除现有记录.您可以使用WHERE子句删除查询删除选定行,否则所有记录将被删除. 语法: 删除查询的WHERE子句的基本语法如下: ...

  9. 联玛客(T 面试)

    我看你写的项目都是SSM架构,那我们就来聊下Spring 1.Spring的生命周期,与生命周期相关的事件? 2.阿里巴巴开发手册中的规范有哪些? 切到了异常捕捉话题 3.线程你有了解吗? 创建线程的 ...

  10. vue之组件的使用(转载)

    在工程目录/src下的component文件夹下创建一个 firstcomponent.vue并写仿照 App.vue 的格式和前面学到的知识写一个组件. <template> <d ...