【计算几何】【凸包】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;
}
时间: 2024-10-11 11:59:18

【计算几何】【凸包】bzoj2829 信用卡凸包的相关文章

bzoj2829 信用卡凸包

2829: 信用卡凸包 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 226  Solved: 102 [Submit][Status][Discuss] Description Input Output Sample Input 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 Sample Output 21.66 HINT 本样例中的2张信用卡的轮廓在上图中

题解 P3829 【[SHOI2012]信用卡凸包】

题目链接 这题如果每个信用卡都不一样不知道怎么做啊--萌新求大佬私信指点迷津qaq Solution [SHOI2012]信用卡凸包 题目大意:给定一个矩形,将其四角替换为\(\frac{1}{4}\)圆弧(也就是信用卡的样子),将这个矩形进行旋转和平移之后得到多个矩形,求凸包长 计算几何 分析:旋转什么的基本操作,我们看比较恶心的圆弧怎么算 样例一可以知道如果\(r=0\)我们直接对矩形顶点求凸包就好,如果\(r\neq0\)我们可以通过平移,将其周长转化为若干个圆心点的凸包周长加一个圆的周长

P3829 [SHOI2012]信用卡凸包

传送门 不难发现这个信用卡凸包的周长就是一个整圆的周长再加上所有的四个边角的点形成的凸包 于是直接把这个凸包求出来即可 还有就是一个向量\((x,y)\)逆时针旋转\(t\)度之后坐标是\((x*cos(t)-y*sin(t),x*sin(t)+y*cos(t))\)(话说原来这玩意儿还有公式的么--) //minamoto #include<bits/stdc++.h> #define inf 1e10 #define eps 1e-10 #define fp(i,a,b) for(regi

[hdu contest 2019-07-29] Azshara&#39;s deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点. 首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里. 然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp. 区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连

Luogu-3829 [SHOI2012]信用卡凸包

这道题的转化很巧妙,可以把信用卡四个角的圆心看做平面上的点来做凸包,\(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.141592653589793

[模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

//to update 一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson 凸包 Andrew 算法, 即分别求上, 下凸包. 时间复杂度 \(O(n \log n)\). struct tvec{db x,y;}; il int dcmp(db a){return fabs(a)<=eps?0:(a>0?1:-1);} il db p2(db a){return a*a;} il db gougu1(db a,db b){retu

SHOI2012 信用卡凸包

题意: 题目链接 题目大意: 给出n个四角为pi/4的圆弧的类矩形,求它们凸包的周长 思路: 乍看似乎没有思路,但注意到r=0时求的是一个裸的凸包 考虑当r不等于0时,我们先按之前的方法求出凸包周长 然后对于每个拐点求其角度,而后求出这段圆弧长,累加即可... for(int i=1;i<=m;++i) { ans+=(q[i]-q[i+1]).dist(); double cs=((q[i]-q[i+1])*(q[i+2]-q[i+1]))/(q[i]-q[i+1]).dist()/(q[i+

HDU 1392.Surround the Trees【凸包(求凸包周长)】【5月10】

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9790    Accepted Submission(s): 3763 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw