[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 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
- 3 0 00 1-1 21 2
- 12.566370614359172464
- 4 1 -10 01 22 01 1
- 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的更多相关文章
- 【14.36%】【codeforces 614C】Peter and Snow Blower
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【CodeForces 613A】Peter and Snow Blower
题 题意 给出原点(不是(0,0)那个原点)的坐标和一个多边形的顶点坐标,求多边形绕原点转一圈扫过的面积(每个顶点到原点距离保持不变). 分析 多边形到原点的最小距离和最大距离构成的两个圆之间的圆环就 ...
- 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 ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- A. Peter and Snow Blower 解析(思維、幾何)
Codeforce 613 A. Peter and Snow Blower 解析(思維.幾何) 今天我們來看看CF613A 題目連結 題目 給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆 ...
- 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 ...
- CodeForces 614C Peter and Snow Blower
简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可 #include<cstdio> #include<cstring> #include<cmath> ...
- codeforces 613A. Peter and Snow Blower
题目链接 给一个多边形, 一个多边形外的定点, 求这个点距离多边形的最短距离和最长距离. 最长距离肯定是和某个顶点的连线, 而最短距离是和点的连线或是和某条边的连线. 对于一条边上的两个点a, b, ...
- Peter and Snow Blower CodeForces - 613A (点到线段距离)
大意: 给定多边形, 给定点$P$, 求一个以$P$为圆心的最小的圆环包含整个多边形. #include <iostream> #include <cmath> #define ...
随机推荐
- JqGrid 自定义子表格 及 自定义Json 格式数据不展示
项目第一次使用JqGrid ,发现功能强大,但由于对他不熟悉,也没有少走弯路,记录一下. 1.引用 <link href="~/Scripts/JqGrid/jqgrid/css/ui ...
- unity 截图 压缩 处理
/****************************************************** unity屏幕截图,并转换成Base64码* 作者: lyb* 日期:2017年7月25 ...
- lombok-@Accessors注解
@Accessors 有3个选项:如图默认是false 1.当fluent = true时 2.当fluent = true时
- np.split()和np.array_split()
来自:爱抠脚的coder np.split(): 该函数的参数要么按照数字划分(int),要么是按列表list划分:如果仅是输入一个int类型的数字,你的数组必须是均等的分割,否则会报错. np.ar ...
- 项目上有红色感叹号, 一般就是依赖包有问题, remove依赖,重新加载,maven的也行可认删除,自己也会得新加载
项目上的红色叹号, 要下面提示: "Problems" 里的errors , 看是什么错误, 一般是由于网络等原因, 依赖没有下载完整, 只有文件名字对了, 内容不全, ...
- leecode第一百四十二题(环形链表II)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- Codeforces 1005 E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...
- [MySQL]典型的行列转换
列变成行 测试数据库数据样式: 应用的sql语句: SELECT TM,NAME,SUM(GE) AS 'GE',SUM(GD) AS 'GD',SUM(CT) AS 'CT',SUM(NUM) AS ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格惰性加载节点
jQuery EasyUI 树形菜单 - 树形网格惰性加载节点 有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载 ...
- Shell脚本中的并发(转)
转自http://blog.csdn.net/wangtaoking1/article/details/9838571 主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚 ...