首页 > 其他分享 >P3829 题解

P3829 题解

时间:2023-01-08 11:33:41浏览次数:70  
标签:return pt point int double st 题解 P3829

题目传送门

二维凸包模板传送门

题目分析

类似于凸包模板的一道题。

我们循序渐进地考虑,当半径 \(r=0\) 时,显然是一个二位凸包模板。

接着我们将圆弧加进去,仔细观察发现,我们构造出的凸包中的直线部分就是将圆心之间连起来的长度,而一个圆的贡献就是 \(\dfrac{1}{4}\) 个圆弧,四个圆贡献加起来正好就是一个圆的周长。

然后将模板改一下就做完了。

贴上代码

#include<bits/stdc++.h>
#define int long long
#define ok puts("Yes")
#define no puts("-1")
#define pi acos(-1)
#define at atan(A/B)
using namespace std;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	return x*f;
}
const int maxn=2e5+5;
const double eps=1e-18;
double equ(double x){
	if(fabs(x)<eps) return 0;
	if(x>=0) return 1;
	else return -1;
}
int n;
int cnt;
double a,b,r,x,y,op;
double A,B,C;
double ans;
struct point{
	double x,y;
	point(double _x=0,double _y=0):x(_x),y(_y){}
	point operator + (const point &pt){return point(x+pt.x,y+pt.y);}
	point operator - (const point &pt){return point(x-pt.x,y-pt.y);}
}p[maxn];
bool cmp(point p,point q){
	if(equ(p.x-q.x)==0) return p.y<q.y;
	else return p.x<q.x;
}
struct my_stack{
	point stk[maxn];int sz=0;
    void push(point x){stk[sz++]=x;}
    point top(){return stk[sz-1];}
    point sec_top(){return stk[sz-2];}
    int size(){return sz;}
    void pop(){sz--;}
}st;
// bool slope(int aa,int b,int c){return (p[aa].y-p[b].y)*(p[b].x-p[c].x)>(p[aa].x-p[b].x)*(p[b].y-p[c].y);}
double dis(point a,point b){return sqrt((a.y-b.y)*(a.y - b.y)+(a.x-b.x)*(a.x-b.x));}
double cross(point a,point b){return a.x*b.y-a.y*b.x;}
double dot(point a,point b){return a.x*b.x+a.y*b.y;}
double len(point a){return sqrt(dot(a,a));}
double angle(point a,point b){return acos(dot(a,b)/len(a)/len(b));}
inline void init(){
	n=read();
	scanf("%lf%lf%lf",&a,&b,&r);
	A=a-2.0*r;B=b-2.0*r;C=sqrt(A*A+B*B)/2.0;
	for(register int i=1;i<=n;++i){
		scanf("%lf%lf%lf",&x,&y,&op);
		double xx=cos(op+at)*C,yy=sin(op+at)*C;
		p[++cnt].x=x+xx;p[cnt].y=y+yy;
		p[++cnt].x=x-xx;p[cnt].y=y-yy;
		xx=cos(op-at)*C,yy=sin(op-at)*C;
		p[++cnt].x=x+xx;p[cnt].y=y+yy;
		p[++cnt].x=x-xx;p[cnt].y=y-yy;
	}
	sort(p+1,p+cnt+1,cmp);
}
signed main(){
	init();
	for(register int i=1;i<=cnt;++i){
		while(equ(cross(st.top()-st.sec_top(),p[i]-st.sec_top()))==-1&&st.size()>1) st.pop();
		st.push(p[i]);
	}
	int siz=st.size();
	for(register int i=cnt-1;i>=1;--i){
		while(equ(cross(st.top()-st.sec_top(),p[i]-st.sec_top()))==-1&&st.size()>siz) st.pop();
		st.push(p[i]);
	}
	for(register int i=0;i<st.size()-1;++i) ans+=dis(st.stk[i],st.stk[i+1]);
	ans+=2.0*pi*r;
	printf("%.2lf",ans);
}

标签:return,pt,point,int,double,st,题解,P3829
From: https://www.cnblogs.com/yizhixiaoyun/p/17034319.html

相关文章

  • SYUCT第五次限时训练题解
    第五次限时训练题目大意及ac代码Maxmina题目大意accode#include<iostream>usingnamespacestd;intT,n,m;inta[55];intmain(){cin>>T;whil......
  • Atcoder ABC 284题解
    DHappyNewYear2023(枚举,时间复杂度计算)题意​ 给定\(n\\le\9\times10^{18}\),给出式子\(n=p^2\timesq\),该式子必定有解且有唯一解。请输出\(p\)和\(q\)......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • 【青少年CTF】Crypto-easy 题解小集合
    Crypto-easy1.BASE拿到附件用cyberchef自动解码得到flag2.basic-crypto拿到附件发现是一串01的数字,这时候想到二进制转换然后base64在线解码接着根据提示想到凯撒......
  • 洛谷-P8932 题解
    正文♦时间复杂度:\(\mathcal{O}(|S|+q)\)找规律的题。我们先来研究三组数据:abcd,答案是2;aa,答案是1;ccffab,答案是2。以下称将一个子串按题意每个字符双倍的......
  • CF1007A 题解
    题目传送门题目分析贪心水题。首先将原数组从小往大排序,然后不难想到一个简单但会超时的思路,即对每个位置,向后找到一个比自己大的数进行搭配。然后是一个简单的小优化,......
  • 【NOI2019】序列 题解(贪心模拟费用流)
    (感觉是有史以来自己代码最好看的一次贪心模拟费用流。LG传送门Solution1经过一番思考,不难发现我们可以根据题面建图跑费用流。具体见下图:(从@cmd大佬那里薅来的。)然......
  • 【题解】P4632 [APIO2018] 新家
    码力底下,思维迟钝,我该怎么办?还是说这题太毒?题意给定一个\(n\)个商店,第\(i\)个商店的类型为\(t_i\),在\([a_i,b_i]\)时间营业,位于位置\(x_i\)。定义某一时刻一......
  • 题解: Luogu P8894 「UOI-R1」求和
    题目链接:link前言我的一个学长在一次比赛中出了这道题,然后,我就把这道题切了其实这道题还是比较简单的,然后我就介绍一下我的比赛时的思路和做法30分做法根据标签我......