Peter and Snow Blower

题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少?

思路:开始就认为是一个凸包的问题,像poj2187求点对平方的最大值一样,但是有一个点是确定的(ps:这道题在div1里面可是A啊!这么复杂?),所以直接求解即可,时间复杂度也就O(n);还有就是怎么求多边形到确定点的最小距离呢?这就不只是暴力求点对之间的距离这么简单了。因为一个多边形绕一个点转动时,有时候是定点到边的距离,所以转化为了点到线段的最短距离,使用了向量点积和叉积的性质即可求解;还有注意使用int会爆了问题。。。WA了几次

#include<bits/stdc++.h>
using namespace std;
`#define inf 0x3f3f3f3f
const double PI = acos(-1.0);
struct point{
int x,y;
point(){}
point(int _x,int _y){
x = _x; y = _y;
}
long long operator *(const point &b)const{// 叉乘
return (1LL*x*b.y - 1LL*y*b.x);
}
point operator -(const point &b)const{
return point(x - b.x,y - b.y);
}
long long dot(const point &b){ //点乘
return 1LL*x*b.x + 1LL*y*b.y;
}
double dist(const point &b){
return sqrt(1LL*(x-b.x)*(x-b.x)+1LL*(y-b.y)*(y-b.y));
}
long long dist2(const point &b){
return 1LL*(x-b.x)*(x-b.x)+1LL*(y-b.y)*(y-b.y);
}
double len(){
return sqrt(1LL*x*x+1LL*y*y);
}
void input(){
scanf("%d%d",&x,&y);
}
}; double point_to_segment(point a,point b,point c)//点a到“线段” bc的距离
{
point v[4];
v[1] = {c.x - b.x,c.y - b.y};
v[2] = {a.x - b.x,a.y - b.y};
v[3] = {a.x - c.x,a.y - c.y};
if(v[1].dot(v[2]) < 0) return v[2].len();
if(v[1].dot(v[3]) > 0) return v[3].len();
return fabs(1.*(v[1]*v[2])/v[1].len());
}
const int MAXN = 1e5+10;
point p[MAXN];
int main()
{
int n,i;
cin>>n;
for(i = 0;i <= n;i++){
p[i].input();
}
p[++n] = p[1];
double mx = 0.0,mn = 1.*inf;
for(i = 1;i < n;i++){
mx = max(mx,p[0].dist(p[i]));
mn = min(mn,point_to_segment(p[0],p[i],p[i+1]));
}
printf("%.12f\n",PI*(mx*mx - mn*mn));
}

最新文章

  1. grouping sets从属子句的运用
  2. 都别说工资低了,我们来一起写简单的dom选择器吧!
  3. GDB调试多线程
  4. 【转】PowerShell入门(二):PowerShell是Cmd命令行的加强版吗?
  5. CSS的压缩 方法与解压
  6. struts2文件下载及 &lt;param name=&quot;inputName&quot;&gt;inputStream&lt;/param&gt;的理解
  7. centos 6 搭建ftp服务器支持匿名读写
  8. 继续Python爬虫
  9. ANDROID L——Material Design详细解释(UI控制)
  10. Codeforces Round #265 (Div. 2) C. No to Palindromes! 构建无回文串子
  11. .Net异步函数存在的限制
  12. java中static关键字的作用
  13. javascript执行上的一点总结
  14. DirectX11 With Windows SDK--11 混合状态与光栅化状态
  15. 使用EFCore处理并发冲突
  16. spring4笔记----Spring几种常用的容器后处理器
  17. Java log4j
  18. 【托业】【新托业TOEIC新题型真题】学习笔记11-题库六-P7
  19. linux stat 简单介绍
  20. Git 撤消操作(分布式版本控制系统)

热门文章

  1. C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象
  2. Nodepad ++
  3. C# 之 AES加密源码
  4. 为什么虚拟机上刚装的centos7只有lo回环网络接口?
  5. 用js实现简单排序算法
  6. Python(2.7.6) 列表推导式
  7. vmware workstation 12 安装windows7 网卡不能安装驱动的问题
  8. 深入了解webkit内核第一篇:JavaScript引擎深度解析
  9. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  10. iOS开发——百度云推送