【计算几何】【凸包】bzoj2829 信用卡凸包
http://hzwer.com/6330.html
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 100001
#define EPS 0.00000001
typedef double db;
const db PI=acos(-1.0);
struct Point{db x,y;}p[N<<2],bao[N<<2];
bool operator < (Point a,Point b){return fabs(a.x-b.x)>=EPS?a.x<b.x:a.y<b.y;}
typedef Point Vector;
Vector operator + (Vector a,Vector b){return (Vector){a.x+b.x,a.y+b.y};}
Vector operator - (Vector a,Vector b){return (Vector){a.x-b.x,a.y-b.y};}
Vector Rotate(Vector a,db rad)
{return (Vector){a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad)};}
db sqr(db x){return x*x;}
db Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
db dist(Point a,Point b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
int n,m,en;
db a,b,r,mx,my,jiao,ans;
int main()
{
scanf("%d%lf%lf%lf",&n,&b,&a,&r);
a-=(2.0*r);
b-=(2.0*r);
for(int i=1;i<=n;++i)
{
scanf("%lf%lf%lf",&mx,&my,&jiao);
p[++m]=Rotate((Vector){a*0.5,b*0.5},jiao)+(Point){mx,my};
p[++m]=Rotate((Vector){(-a)*0.5,b*0.5},jiao)+(Point){mx,my};
p[++m]=Rotate((Vector){a*0.5,(-b)*0.5},jiao)+(Point){mx,my};
p[++m]=Rotate((Vector){(-a)*0.5,(-b)*0.5},jiao)+(Point){mx,my};
}
sort(p+1,p+1+m);
for(int i=1;i<=m;++i)
{
while(en>1&&Cross(bao[en]-bao[en-1],p[i]-bao[en])<=0.0)
--en;
bao[++en]=p[i];
}
int t=en;
for(int i=m-1;i;--i)
{
while(en>t&&Cross(bao[en]-bao[en-1],p[i]-bao[en])<=0.0)
--en;
bao[++en]=p[i];
}
for(int i=2;i<=en;++i)
ans+=dist(bao[i-1],bao[i]);
printf("%.2f\n",ans+dist(bao[en],bao[1])+PI*r*2.0);
return 0;
}
【计算几何】【凸包】bzoj2829 信用卡凸包的更多相关文章
- [BZOJ2829] 信用卡 (凸包)
[BZOJ2829] 信用卡 (凸包) 题面 信用卡是一个矩形,唯四个角做了圆滑处理,使他们都是与矩形两边相切的1/4园,如下图所示,现在平面上有一些规格相同的信用卡,试求其凸包的周长.注意凸包未必是 ...
- BZOJ2829信用卡凸包——凸包
题目描述 输入 输出 样例输入 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 样例输出 21.66 提示 本样例中的2张信用卡的轮廓在上图中用实线标出 ...
- Bzoj2829 信用卡凸包
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 333 Solved: 155 Description Input ...
- BZOJ-2829 信用卡凸包
凸包题. 我们先把所有信用卡的四个定点的坐标求出来,然后计算凸包长度,最后加上一个圆的周长就行. #include <cstdlib> #include <cstdio> #i ...
- 2019.02.21 bzoj2829: 信用卡凸包(凸包)
传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...
- 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)
[BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...
- 【BZOJ 2829】 2829: 信用卡凸包 (凸包)
2829: 信用卡凸包 Description Input Output Sample Input 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 Sa ...
- bzoj 2829 信用卡凸包(凸包)
2829: 信用卡凸包 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1342 Solved: 577 [Submit][Status][Disc ...
- [SHOI2012]信用卡凸包(凸包+直觉)
这个题还是比较有趣. 小心发现,大胆猜想,不用证明! 我们发现所谓的信用卡凸包上弧的长度总和就是圆的周长! 然后再加上每个长宽都减去圆的直径之后的长方形的凸包周长即可! #include<ios ...
随机推荐
- Vim使用小记(一)常用操作
By francis_hao Sep 22,2016 vim的功能自然不止如此,这里只是把日常使用频率较高的记录下来,若想了解vim的全部功能可查阅其帮助手册:help,或者查询指定命令的用法: ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) B
B. Little Artem and Grasshopper time limit per test 2 seconds memory limit per test 256 megabytes in ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- javascript中的递增递减操作符
javascript中递增递减属于一元操作符,所谓一元操作符,即只能操作一个值的操作符. 递增和递减操作符各有两个版本:前置型和后置型.顾名思义,前置型应该位于要操作的变量之前,而后置型应该位于要操作 ...
- .NET的PE文件结构篇(转)
一.开篇 开篇我要讲述一个关于PE文件结构的文章,这篇文章动手能力比较强,希望大家能够动手进行操作,这边文章篇幅有可能会长一些,为了方便大家阅读我可以将其分为几个部分进行讲解,主要分为以下几个部分: ...
- 单选按钮radio与文字如何对齐?
布局如下: <input type="radio" value="立即发送" name="a_1">立即发送 <input ...
- BigDecimal与Long、int之间的互换
在实际开发过程中BigDecimal是一个经常用到的数据类型,它和int Long之间可以相互转换. 转换关系如下代码展示: int 转换成 BigDecimal 数据类型 //int 转换成 big ...
- [USACO1.3]虫洞
Luogu链接 题目描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他 ...
- HDFS 的Trash回收站
1)在core-site.xml文件中添加这个配置 在每个节点(不仅仅是主节点)上添加配置 core-site.xml,增加如下内容 <property> <name>fs.t ...
- 【mysql】索引与排序、重复索引、冗余索引
索引与排序 排序可能发生2种情况: 1: 对于覆盖索引,直接在索引上查询时,就是有顺序的, using index 2: 先取出数据,形成临时表做filesort(文件排序,但文件可能在磁盘上,也可能 ...