这道题的转化很巧妙,可以把信用卡四个角的圆心看做平面上的点来做凸包,\(ans\)就是凸包周长加上一个圆的周长

// luogu-judger-enable-o2
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+100;
const double Pi=3.14159265358979323846;
struct Point{
double x,y;
Point(double xx=0,double yy=0){
x=xx,y=yy;
}
bool operator < (Point a) const{
return x==a.x?y<a.y:x<a.x;
}
bool operator == (Point a) const{
return x==a.x&&y==a.y;
}
}a[maxn],b[maxn],c;
struct Vector{
double x,y;
Vector(double xx=0,double yy=0){
x=xx,y=yy;
}
}zhy[4];
int dcmp(double x){return fabs(x)<1e-9?0:(x>0?1:-1);}
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
Point operator + (Point a,Vector b){return Point(a.x+b.x,a.y+b.y);}
double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
Vector rotate(Vector a,double p){return Vector(a.x*cos(p)-a.y*sin(p),a.x*sin(p)+a.y*cos(p));}
double dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
double len(Vector a){return sqrt(dot(a,a));}
int n,m,tot;
double r,du;
void tb(Point *p,int n,Point *q,int &m){
sort(p+1,p+n+1);
q[m=1]=p[1];
if(n==1) return;
for(int i=2;i<=n;i++){
while(m>1&&dcmp((q[m]-q[m-1])*(p[i]-q[m-1]))<=0)
m--;
q[++m]=p[i];
}
int k=m;
for(int i=n-1;i>=1;i--){
while(m>k&&dcmp((q[m]-q[m-1])*(p[i]-q[m-1]))<=0)
m--;
q[++m]=p[i];
}
m--;
}
double C(Point *p,int n){
if(n==1) return 0;
double tot=0;
for(int i=1;i<n;i++)
tot+=len(p[i+1]-p[i]);
return tot+len(p[n]-p[1]);
}
int main(){
scanf("%d",&m);
scanf("%lf%lf%lf",&zhy[0].y,&zhy[0].x,&r);
zhy[0].x/=2,zhy[0].y/=2;
zhy[0].x-=r,zhy[0].y-=r;
zhy[1]=zhy[2]=zhy[3]=zhy[0];
zhy[1].x*=-1,zhy[2].x*=-1,zhy[2].y*=-1,zhy[3].y*=-1;
for(int i=1;i<=m;i++){
scanf("%lf%lf%lf",&c.x,&c.y,&du);
for(int j=0;j<4;j++)
a[++tot]=c+rotate(zhy[j],du);
}
tb(a,tot,b,n);
double ans=C(b,n);
ans=ans+2*Pi*r;
printf("%.2lf\n",ans);
return 0;
}

最新文章

  1. 如何优雅的使用RabbitMQ
  2. Atitit.常见软件 数据 交换格式 标准
  3. CMY/CMYK 打印机色彩
  4. POJ 2421(prim)
  5. 使用getElementById获取xml中的指定元素
  6. 饶有兴致的用javascript做了个贪食蛇游戏
  7. Java面向对象编辑
  8. Linux下 fcntl 函数用法说明
  9. Bootstrap Alert 使用
  10. 《计算机程序的构造和解释(第2版)》【PDF】下载
  11. poj1265&amp;&amp;2954 [皮克定理 格点多边形]【学习笔记】
  12. PHP共享内存yac操作类
  13. Nginx 集群 反向代理多个服务器
  14. Java 汇编代码
  15. CAP原则(CAP定理)、BASE理论
  16. linux rename命令批量修改文件名
  17. mysql插入json数据
  18. 北京Uber优步司机奖励政策(4月22日)
  19. Form_通过FND_FNDFLUPL标准功能上传CSV控件(案例)
  20. Moq/moq4

热门文章

  1. elk systemd管理
  2. sqlserver修改表主键自增
  3. C# SqlBulkCopy类批量导入数据
  4. 怎样取消不能改动(仅仅读打开)的word文件的password
  5. Hadoop2.6.0版本MapReudce示例之WordCount(一)
  6. LeetCode78:Subsets
  7. FFmpeg与libx264 x264接口对应关系源代码分析
  8. 计算CPU利用率
  9. Jmeter+Ant+Jenkins接口自动化测试框架搭建
  10. [Sdoi2013]直径(树的直径)