BZOJ 2829 信用卡凸包 ——计算几何
凸包裸题
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define eps 1e-8
#define mp make_pair const double pi=acos(-1.0); struct Vector{
double x,y;
void print()
{
printf("Vector (%.3f,%.3f)\n",x,y);
}
};
struct Point{
double x,y;
void print()
{
printf("Point (%.3f,%.3f)\n",x,y);
}
}; double operator * (Vector a,Vector b)
{return a.x*b.y-a.y*b.x;} Point operator + (Point a,Vector b)
{Point ret;ret.x=a.x+b.x;ret.y=a.y+b.y;return ret;} Vector operator - (Point a,Point b)
{Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;} double dist(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} Vector Turn(Vector a,double b)
{
Vector ret;
// printf("Turn : \n");
// a.print(); printf("in %.6f\n",b/pi*180);
ret.x=a.x*cos(b)-a.y*sin(b);
ret.y=a.y*cos(b)+a.x*sin(b);
// ret.print();
return ret;
} int n,top=0,cnt=0;
double a,b,r,x,y,theta,ans=0;
Vector v[4];
int mov[4][2]={{1,1},{1,-1},{-1,1},{-1,-1}};
Point p[500005];
Point sta[500005]; bool cmp(Point a,Point b)
{
return fabs(a.x-b.x)<eps?a.y<b.y:a.x<b.x;
} void Andrew()
{
cnt=0;
sort(p+1,p+top+1,cmp);
// F(i,1,top) p[i].print();
sta[++cnt]=p[1];
F(i,2,top)
if (fabs(p[i].x-p[i-1].x)>eps||fabs(p[i].y-p[i-1].y)>eps){
// printf("Add : ");p[i].print();
while (cnt>=2&&((sta[cnt]-sta[cnt-1])*(p[i]-sta[cnt]))<0) cnt--;
sta[++cnt]=p[i];
// printf("Instack : \n");F(i,1,cnt) sta[i].print(); printf("\n\n");
}
D(i,top-1,1)
if (fabs(p[i].x-p[i+1].x)>eps||fabs(p[i].y-p[i+1].y)>eps){
while (cnt>=2&&((sta[cnt]-sta[cnt-1])*(p[i]-sta[cnt]))<0) cnt--;
sta[++cnt]=p[i];
}
F(i,1,cnt-1) ans+=dist(sta[i],sta[i+1]);
ans+=r*2*pi;
printf("%.2f\n",ans);
// F(i,1,cnt) sta[i].print();
} int main()
{
scanf("%d",&n);
scanf("%lf%lf%lf",&a,&b,&r);
a/=2;b/=2;a-=r;b-=r;
F(i,0,3) v[i].x=mov[i][0]*b,v[i].y=mov[i][1]*a;
// printf("Over\n");
F(i,1,n)
{
scanf("%lf%lf%lf",&x,&y,&theta);
Point now; now.x=x;now.y=y;
F(j,0,3)
p[++top]=now+Turn(v[j],theta);
}
// F(i,1,top) p[i].print();
Andrew();
}
BZOJ 2829 信用卡凸包 ——计算几何的更多相关文章
- bzoj 2829 信用卡凸包(凸包)
2829: 信用卡凸包 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1342 Solved: 577 [Submit][Status][Disc ...
- 【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 ...
- [SHOI2012]信用卡凸包(计算几何)
/* 考验观察法?? 可以发现最终答案等于所有作为圆心的点求出凸包的周长加上一个圆的周长 向量旋转 (x1, y1) 相较于 (x2, y2) 旋转角c 答案是 (dtx * cosc - dty * ...
- 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)
[BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...
- [SHOI2012]信用卡凸包(凸包+直觉)
这个题还是比较有趣. 小心发现,大胆猜想,不用证明! 我们发现所谓的信用卡凸包上弧的长度总和就是圆的周长! 然后再加上每个长宽都减去圆的直径之后的长方形的凸包周长即可! #include<ios ...
- [BZOJ2829] 信用卡 (凸包)
[BZOJ2829] 信用卡 (凸包) 题面 信用卡是一个矩形,唯四个角做了圆滑处理,使他们都是与矩形两边相切的1/4园,如下图所示,现在平面上有一些规格相同的信用卡,试求其凸包的周长.注意凸包未必是 ...
- luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转
LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...
- bzoj 1964: hull 三维凸包 计算几何
1964: hull 三维凸包 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 54 Solved: 39[Submit][Status][Discuss ...
- 计算几何(凸包):SHTSC 2012 信用卡凸包
这道题是水题,发现平移某些边,答案就是圆心的凸包+一个圆的周长. 不要忽视精度误差! #include <algorithm> #include <iostream> #inc ...
随机推荐
- Eclipse中一直出现 Android SDK resolving error markers
Eclipse中一直出现“Android SDK: resolving error markers”. 此类情况网上有诸多描述以及相应尝试性的解决方法,不久前本人即出现此类情况,尝试多种方案后未能解决 ...
- uvm_reg_field——寄存器模型(二)
uvm_reg_field是最基本寄存器单元. typedef class uvm_reg_cbs; //----------------------------------------------- ...
- 基于 Azure IaaS 搭建企业官网的规划和实践
本课程主要介绍了基于 Azure IaaS 搭建企业官网的案例分析和实践,实践讲解如何使用 Azure 门户创建虚拟机, 创建虚拟网络, 创建存储账户等. 具体包括项目背景介绍, 项目架构, 准备和实 ...
- MySQL性能优化奇技淫巧
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使 ...
- codevs 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description You are a mouse that lives in a cage in ...
- flex常用属性
<1>align-items: 垂直方向的对齐方式 align-items: stretch(拉伸,布满父容器) | center(垂直居中) | flex-start(上对齐) | fl ...
- 快学UiAutomator各种框架介绍
Monkey 编写语言:命令行 运行环境:使用adb连接PC运行测试对象:Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键等操作来对设备上的程 ...
- CPP-基础:char、BYTE、byte
一,C++语言的内建类型中没“BYTE”这么个类型.BYTE是WINDOWS Platform SDK中windef.h里面定义的:typedef unsigned char BYTE; 二,char ...
- C05 C语言字符串和数组
目录 数组 字符串 数组 概念 数组是有序数据的集合. 数组中的每一个元素属于同一个数据类型. 通过数组名和下标唯一确定数组中的元素. 一维数组的定义 语法格式 数据类型 数组名[常量表达式] 例 ...
- 身份证号正则校验(js校验+JAVA校验)
js校验身份证号[15位和18位] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...