【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.5707963268Sample Output
21.66HINT
本样例中的2张信用卡的轮廓在上图中用实线标出,如果视1.5707963268为
Pi/2(pi为圆周率),则其凸包的周长为16+4*sqrt(2)
【分析】
乍一看还是不会做hh。
把那个圆拿出来,做凸包,最后再加一个圆形的周长就好了。
至于为什么,我还是看黄学长博客的,只能意会一下,不会证明,但是我觉得应该是把凸包向外平移然后凸多边形外角和等于360度,说明外面可以拼成一个完整的圆吧。
所以一开始a-=2*r,b-=2*r。
说一下旋转那部分,傻傻地画图搞了很久,用向量就会很方便。
设a和b的夹角是y,要旋转的角是x。
假设中心点在原点,最后再平移。一开始不旋转的时候是(b/2,a/2)
设r*r=a*a+b*b
新点(r*cos(x+y),r*sin(x+y)) -> (r*cosx*cosb-r*sinx*sinb,r*sinx*sinb+r*cosx*sinb) -> (b/2*cosx-a/2*sinx)
其他三个点类似。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 400010 const double eps=0.00001;
const double pi=3.14159265; struct P
{
double x,y;
}t[Maxn],w[Maxn];
int len,wl;
double a,b,r; P operator - (P a,P b)
{
P tt;
tt.x=a.x-b.x;tt.y=a.y-b.y;
return tt;
} /*P rot(P x,double d,double c)
{
P nw;
nw.x=x.x+d*cos(c);
nw.y=x.y+d*sin(c);
return nw;
}*/ P rot(double x,double y,P nw,double c)
{
P ans;
ans.x=x+nw.x*cos(c)-nw.y*sin(c);
ans.y=y+nw.x*sin(c)+nw.y*cos(c);
return ans;
} void make_p(double x,double y,double c)
{
P nw;
nw.x=b/,nw.y=a/; t[++len]=rot(x,y,nw,c);
nw.x=-b/,nw.y=a/; t[++len]=rot(x,y,nw,c);
nw.x=b/,nw.y=-a/; t[++len]=rot(x,y,nw,c);
nw.x=-b/,nw.y=-a/; t[++len]=rot(x,y,nw,c);
/*for(int k=0;k<4;k++)
{
nw.x=x;nw.y=y;
P now=rot(nw,b/2,k*pi/2+c);
t[++len]=rot(now,a/2,(k+1)*pi/2+c);
double tt;
tt=a;a=b;b=tt;
}*/
} double myabs(double x) {return x>?x:-x;} int fbs(double x)
{
if(myabs(x)<=eps) return ;
else return x>?:-;
} bool cmp(P x,P y) {return fbs(x.x-y.x)==?(x.y<y.y):(x.x<y.x);}
double Dot(P x,P y) {return x.x*y.x+x.y*y.y;}
double Cross(P x,P y) {return x.x*y.y-x.y*y.x;} void chull()
{
sort(t+,t++len,cmp);
wl=;
for(int i=;i<=len;i++)
{
while(wl>&&Cross(w[wl]-w[wl-],t[i]-w[wl])<=) wl--;
w[++wl]=t[i];
}
int k=wl;
for(int i=len-;i>=;i--)
{
while(wl>k&&Cross(w[wl]-w[wl-],t[i]-w[wl])<=) wl--;
w[++wl]=t[i];
}
wl--;
} double get_length()
{
double ans=;
for(int i=;i<wl;i++)
{
ans+=sqrt(Dot(w[i]-w[i+],w[i]-w[i+]));
}
ans+=sqrt(Dot(w[wl]-w[],w[wl]-w[]));
return ans;
} int main()
{
int n;
scanf("%d",&n);
scanf("%lf%lf%lf",&a,&b,&r);a-=*r;b-=*r;
len=;
for(int i=;i<=n;i++)
{
double x,y,c;
scanf("%lf%lf%lf",&x,&y,&c);
make_p(x,y,c);
}
chull();
double ans=get_length();
ans+=*r*pi;
printf("%.2lf\n",ans);
return ;
}
2016-12-13 18:38:01
【BZOJ 2829】 2829: 信用卡凸包 (凸包)的更多相关文章
- BZOJ2829信用卡凸包——凸包
题目描述 输入 输出 样例输入 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 样例输出 21.66 提示 本样例中的2张信用卡的轮廓在上图中用实线标出 ...
- luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转
LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...
- BZOJ 2388: 旅行规划 [分块 凸包 等差数列]
传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...
- 【bzoj2829】信用卡凸包 凸包
题目描述 输入 输出 样例输入 26.0 2.0 0.00.0 0.0 0.02.0 -2.0 1.5707963268 样例输出 21.66 题解 凸包 傻逼题,答案显然为:所有圆心构成的凸包周长+ ...
- bzoj 2300: [HAOI2011]防线修建 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...
- bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
- bzoj 2961 共点圆 cdq+凸包+三分
题目大意 两种操作 1)插入一个过原点的圆 2)询问一个点是否在所有的圆中 分析 在圆中则在半径范围内 设圆心 \(x,y\) 查询点\(x_0,y_0\) 则\(\sqrt{(x-x_0)^2+(y ...
- bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】
首先处理处理出来哪些边能连--能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包 ...
- bzoj 1027: [JSOI2007]合金【凸包+Floyd】
参考:https://www.cnblogs.com/zhuohan123/p/3237246.html 因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点.首先考虑一个客户需求能 ...
- hdu4273Rescue(三维凸包重心)
链接 模板题已不叫题.. 三维凸包+凸包重心+点到平面距离(体积/点积) 体积-->混合积(先点乘再叉乘) #include <iostream> #include<cstd ...
随机推荐
- IMDb Search
主要是一个搜索电影,显示电影信息的小程序,开发坏境是xcode7.0,swift2.0 创建HTTP请求连接并对连接格式化 了解NSURLSession类的使用方法 通过NSURLSession类的d ...
- 委托[delegate]_C#
委托(delegate): 委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法.对于静态方法,委托对象封装要调用的方法.对于实例方法,委托对象同时封装一个实例和该实例上的一个方法.如果您 ...
- javascript笔记——js的阻塞特性[转载]
JS具有阻塞特性,当浏览器在执行js代码时,不能同时做其它事情,即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. ...
- 比较X与Y的大小,绝对精准!!!!!!
代码! #include<stdio.h> int max(int a,int b) { int x; x=a+b; return x; } int main() { int i,n,t; ...
- 清理c盘垃圾(将一下代码复制到记事本然后把后缀名改为xxx.bat,然后双击,就ok了!!)
@echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._m ...
- Mysql数据库迁移 Ubuntu14.04
1. 停止数据库服务 sudo service mysql stop 2. 创建数据迁移目标文件夹(实际应该是挂载到新硬盘上) cd /var/lib ls -l drwx------ 6 mysq ...
- Android Animation ---TranslateAnimation
if(stopBtn.getVisibility()==View.VISIBLE){ Animation animation_stop = new TranslateAnimation( Animat ...
- [Database][SQL] 取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
- Python: tkinter实例改名小工具
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...
- CC2640-之功耗
一.测量方式,以DEMO板测量,以消除其它外围不同造成的电流不同. 二.测量结果 以原厂simpleBLEperipheral工程为例 1.如果在低功耗模式下,+5DB发射,最小电流为1.66MA 2 ...
.jpg)
.jpg)
.jpg)
.jpg)