我是靠谱客的博主 高兴大侠,这篇文章主要介绍【HDU6158】The Designer(圆的反演)传送门题解:,现在分享给大家,希望可以做个参考。

传送门


题解:

这道题 n n n 很大,但是这不是问题,是个人都知道在面积足够小的时候直接break掉,所以问题在于怎么求出下一个圆。

直接求显然很麻烦,考虑反演,以两个大圆的切点为反演中心,两个大圆反演后显然就是两条直线,而那些小圆就是夹在直线中的一个个等圆,直接反演回去得到半径即可。


代码:

复制代码
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<bits/stdc++.h> #define ll long long #define re register #define db double #define cs const using std::cerr; using std::cout; cs db eps=1e-14; cs db PI=acos(-1); db R,r1,r2; int sign(db x){return x<-eps?-1:(x>eps?1:0);} struct Pnt{ db x,y;Pnt(){}Pnt(db _x,db _y):x(_x),y(_y){} friend Pnt operator-(cs Pnt &a,cs Pnt &b){return Pnt(a.x-b.x,a.y-b.y);} friend Pnt operator+(cs Pnt &a,cs Pnt &b){return Pnt(a.x+b.x,a.y+b.y);} friend Pnt operator*(cs Pnt &a,cs db b){return Pnt(a.x*b,a.y*b);} friend Pnt operator/(cs Pnt &a,cs db b){return Pnt(a.x/b,a.y/b);} inline db len()cs{return sqrt(x*x+y*y);} }; inline db sqr(db x){return x*x;} inline db dis(cs Pnt &a,cs Pnt &b){ return (a-b).len(); } inline db get_r(cs Pnt &o,cs db &r){ return r/(sqr(o.len())-sqr(r))*sqr(R); } void Main(){ R=20;int T;scanf("%d",&T); while(T--){ scanf("%lf%lf",&r1,&r2); if(r1<r2)std::swap(r1,r2); db x1=sqr(R)/(2*r1); db x2=sqr(R)/(2*r2); db r=(x2-x1)/2;Pnt o((x1+x2)/2,0); db nowr=get_r(o,r); db ans=sqr(nowr); int n;scanf("%d",&n); for(int re i=2;i<=n;++i){ if((i&1)==0)o.y+=2*r,nowr=get_r(o,r); ans+=sqr(nowr);if(sqr(nowr)*PI<eps)break; }printf("%.5fn",ans*PI); } } void file(){ #ifdef zxyoi freopen("designer.in","r",stdin); #endif } signed main(){file();Main();return 0;}

最后

以上就是高兴大侠最近收集整理的关于【HDU6158】The Designer(圆的反演)传送门题解:的全部内容,更多相关【HDU6158】The内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部