C - Peter and Snow Blower

Peter got a new snow blower as a New Year present. Of course, Peter decided to try it immediately. After reading the instructions he realized that it does not work like regular snow blowing machines. In order to make it work, you need to tie it to some point that it does not cover, and then switch it on. As a result it will go along a circle around this point and will remove all the snow from its path.

Formally, we assume that Peter's machine is a polygon on a plane. Then, after the machine is switched on, it will make a circle around the point to which Peter tied it (this point lies strictly outside the polygon). That is, each of the points lying within or on the border of the polygon will move along the circular trajectory, with the center of the circle at the point to which Peter tied his machine.

Peter decided to tie his car to point P and now he is wondering what is the area of ​​the region that will be cleared from snow. Help him.

Input

The first line of the input contains three integers — the number of vertices of the polygon n (), and coordinates of point P.

Each of the next n lines contains two integers — coordinates of the vertices of the polygon in the clockwise or counterclockwise order. It is guaranteed that no three consecutive vertices lie on a common straight line.

All the numbers in the input are integers that do not exceed 1 000 000 in their absolute value.

Output

Print a single real value number — the area of the region that will be cleared. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .

Example

Input
3 0 00 1-1 21 2
Output
12.566370614359172464
Input
4 1 -10 01 22 01 1
Output
21.991148575128551812

Note

In the first sample snow will be removed from that area:

题目的意思是,给你n+1个点(其中一个是基准点(已知),且两两相异,且是按顺序给出),时围城的多边形绕基准点转一圈,求刷过的面积.

易得刷过面积=大圆面积-小圆面积=π*(r大*r大-r小*r小).

怎么确定r大?即为离基准点最远的点与基准点的距离.

怎么确定r小?有可能是基准点到某个点的距离,有可能是到某两点连线的线段的距离(注意是线段).

r大非常好算,r小就麻烦一点了.我们需要考虑基准点与每一对相邻点的关系.

我们需要分类讨论.

我们设基准点为x,两个相邻点为y,z,x与y距离为a,x与z距离为b,y与z距离为c.

如果a^2+c^2<b^2,则x到线段yz的距离为a(特殊的,相等的情况也包含);

如果b^2+c^2<a^2,则x到线段yz的距离为b(特殊的,相等的情况也包含);

其他情况,则为下图:

此时,x到yz的垂线在三角形内部,那么可以用海伦公式解决,先通过公式算出三角形面积,然后乘以2除以c就行了.

 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 #include<cmath>
 using namespace std;
 ;
 const double PI=acos(-1.0);
 int n;
 double Mx,Mn;
 inline int read(){
     ,f=; char ch=getchar();
     '){if (ch=='-') f=-f; ch=getchar();}
     +ch-',ch=getchar();
     return x*f;
 }
 struct point{
     int x,y;
     void re(){x=read(),y=read();}
 }A[];
 double ds(point P,point Q){return sqrt((double)(P.x-Q.x)*(P.x-Q.x)+(double)(P.y-Q.y)*(P.y-Q.y));}
 int main(){
     n=read(),A[].re(),Mx=-,Mn=1e18;
     ; i<=n; i++) A[i].re(); A[n+]=A[];
     ; i<=n; i++){
         ]);
         ],A[]);
         ]);
         Mx=max(Mx,max(a,b));
         if (a*a+c*c<=b*b) Mn=min(Mn,a); else
         if (b*b+c*c<=a*a) Mn=min(Mn,b); else{
             double p=(a+b+c)/2.0,s=sqrt(p*(p-a)*(p-b)*(p-c));
             Mn=min(Mn,s*2.0/c);
         }
     }
     printf("%.15f",PI*(Mx*Mx-Mn*Mn));
     ;
 }

[CodeForces - 614C] C - Peter and Snow Blower的更多相关文章

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

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

  2. 【CodeForces 613A】Peter and Snow Blower

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

  3. 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 ...

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

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

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

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

  6. 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 ...

  7. CodeForces 614C Peter and Snow Blower

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

  8. codeforces 613A. Peter and Snow Blower

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

  9. Peter and Snow Blower CodeForces - 613A (点到线段距离)

    大意: 给定多边形, 给定点$P$, 求一个以$P$为圆心的最小的圆环包含整个多边形. #include <iostream> #include <cmath> #define ...

随机推荐

  1. AjaxHandler

    概要 AjaxHandler组件是在ASP.NET MVC Web应用程序中实现ajax功能的一系列扩展方法,该组件的最初的实现方法借鉴了网上流行的部分源代码, ,经过博主不断完善和改进后推出的比较成 ...

  2. 有了art-template,如有神助

    <div class="form-group col-lg-12"> <label class="control-label col-lg-3 text ...

  3. String,StringBuilder区别,一个是常量,一个是可变量

    String str="这就是爱的呼唤,这就是爱的奉献!!"; //这个str是不可变的字符串序列,要变会生成新的字符串,原字符串不变,是常量 StringBuilder sBui ...

  4. 力扣(LeetCode)13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...

  5. 《剑指offer》第五十四题(二叉搜索树的第k个结点)

    // 面试题54:二叉搜索树的第k个结点 // 题目:给定一棵二叉搜索树,请找出其中的第k大的结点. #include <iostream> #include "BinaryTr ...

  6. keys(),values()和items()

    a={'a':11,'b':'bb','c':321}for x in a.items(): print(x)  # 每条都输出来print("------------")for ...

  7. P499 usebrass2

    有两种方式可以实现多态公有继承 1) 在派生类中重新定义基类的方法 2) 使用虚方法 如下是使用虚方法 brass.h #ifndef BRASS_H #define BRASS_H #include ...

  8. Codeforces 1053 C - Putting Boxes Together

    C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...

  9. Visual Studio 2015+InstallShield 2015

    下载Installshield http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visua ...

  10. (10)进程---Manager数据共享

    Manager  能够实现进程之间的数据共享(dict list),但是必须上锁来确保数据的准确性, 队列则可以实现进程之间数据通信 from multiprocessing import Proce ...