用一个圆心在(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. B树、B+树、红黑树、AVL树

    定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2. ...

  2. UVM基础之------uvm_transaction

    uvm_transaction继承自uvm_object,添加了timing和recording接口,该类是uvm_sequence_item的基类.下边将做剖析 1. 这个类提供了时间戳属性(tim ...

  3. ASP.NET Web API FilterAttribute假想

    偶然的测试发现API FilterAttribute没用引用只会初始化一次 比如: 如果是 Global Action Filter, 则全局只会初始化一次 针对于不同的Controller级别的Ac ...

  4. mysql出错排查

    1,例如:Can't connect to local MySQL server through socket '/tmp/mysql-5.5.37.sock' (2) Mysql链接出错,请配置/A ...

  5. 【转载】Hierarchal Temporal Memory (HTM)

    最近在看机器学习,看能否根据已有的历史来预测Hardware的故障发生概率.下文是一篇很有意思的文章,转自 http://numenta.org/htm.html. NuPIC是一个开源项目,用来实现 ...

  6. javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法

    在做 ajax 滚动加载的时候,越到后面 数据量越大,使用obj.innerHTML+=row添加到页面的时候,出现ie内存不足的情况,此时使用createDocumentFragment,创建一个文 ...

  7. innerHTML与IE浏览器内存泄露问题

    使用 sIEve 扫描和筛选 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 ...

  8. Python 使用re模块实现正则表达式

    # coding: utf-8 # Team : Quality Management Center # Author:Carson # Date :2019/6/21 10:41 # Tool :P ...

  9. docker 应用数据的管理

    容器数据存储的三种方式 docker volume docker管理素质及文件系统的一部分,保存数据最佳方式 bind mounts   将宿主机的文件映射到容器里 tmpfs   存储在宿主机的内存 ...

  10. python程序的编辑和运行、变量

    第一个python程序 python是解释型弱类型高级语言 常见的python解释器CPython.IPython.pypy.JPython.IronPython 方法一.python程序可以写在命令 ...