【计算几何】【圆反演】hdu6158 The Designer

给你内外那俩圆的半径,让你按图中标号的顺序往缝里塞n个小圆,问你小圆的总面积。

不知道圆反演的先去查一下定义。

将两个圆的切点视作反演中心,任取反演半径(比如1),将两个圆反演成两条平行直线,则那些小圆都变成相同大小啦!就很好算了,我们再将小圆通过反演算回它原来的面积即可。

怎样求原小圆的面积呢?

只需求得AB的长度即可。因为A’距离原点的距离我们知道,B’距离原点的距离我们也知道,OA,OB就很好求了,作个差就是AB。

(这套CCPC网络赛的题是我们学校的人出的,线下测题的时候,我的这份代码能AC的,现在我交到hdu上就TLE了,貌似加强了数据,卡了常数……?)

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double PI=acos(-1.0);
int R1,R2,n;
double sqr(double x){
	return x*x;
}
int T;
int main(){
	//freopen("e.in","r",stdin);
	scanf("%d",&T);
	for(;T;--T){
		scanf("%d%d%d",&R1,&R2,&n);
		if(R1>R2){
			swap(R1,R2);
		}
		double r=(1.0/2.0/(double)R1-1.0/2.0/(double)R2)*0.5;
		double X=(1.0/2.0/(double)R1+1.0/2.0/(double)R2)*0.5;
		double now=0,ans=0;
		for(int i=1;i<=n;++i){
			double t=sqrt(X*X+now*now);
			ans+=sqr((1.0/(t-r)-1.0/(t+r))*0.5)*PI;
			if(i&1){
				now+=r*2.0;
			}
		}
		printf("%.5lf\n",ans);
	}
	return 0;
}
时间: 2024-10-10 09:36:54

【计算几何】【圆反演】hdu6158 The Designer的相关文章

【计算几何】【圆反演】hdu6097 Mindis

给你一个中心在原点的圆,再给你俩在圆内且到原点距离相等的点P,Q,让你在圆上求一点D,最小化DP+DQ. http://blog.csdn.net/qq_34845082/article/details/77099332 附:过反演中心的圆反演后变成一条和该圆正交的直线. 不过反演中心的圆反演后是一个与原圆关于反演中心位似的圆. 不过反演中心的直线反演后变成一个过反演中心且与其正交的圆. #include<cstdio> #include<cmath> using namespac

计算几何-圆 模板 训练指南267

#include #include #include #include #include #include #include #include #include #include #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const double eps = 1e-10; const int inf = 0x3f3f3f3f; using namespace

HDU 4773 Problem of Apollonius——圆反演

题面 HDU4773 解析  大概是圆反演的模板吧. 以点$P(x3, y3)$为反演中心,任意长为反演半径,将两个已知圆反演,设反演后的圆为$A'$, $B'$,所求圆反演后为一条直线,根据题目中的要求,该直线为两圆的外公切线.因此我们只需要求出两圆的外公切线即可. 然后会发现WA了,因为题目中还有一个要求,所求圆要外切于两圆,即反演变换后反演中心$P$和$A'$的圆心要在同侧. 还有一个我一开始做错了的地方,原来的圆心$O$反演后就不是新的圆心了!!!可以连接$PO$,求其与圆的两个交点,两

【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle

题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆上面再塞圆,然后反演回去算面积就行了. #include<cstdio> #include<cmath> using namespace std; const double pi=3.14159; int n,K; double R,anss[12]; int main(){ //fr

hdu 4773 圆的反演

第一次接触反演算法. 通过反演圆以求得反演后的直线. 圆的相切即为直线和圆的相切,切点是关键. 值得注意的是,不过中心的直线反演后得到不过中心的圆,圆圆反演后得到另一个圆,因为中途可以得到一条直线,所以可以简化计算. 反演半径不可以随意选取,过大会导致精度问题. #include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#includ

【模板】【计几】圆的反演

hdu4773:http://acm.hdu.edu.cn/showproblem.php?pid=4773 题意:给你两个相离的圆,以及一个点,求所有和这两个圆相切,并且经过该点的圆. 我们先画出满足题意的圆,然后把这三个圆反演,给定的两个圆因为不经过p点,反演后是两个圆,然后ans圆经过p点,所以反演后是一条直线,又因为和两个圆相切,所以反演出来的直线也是和两个圆相切的,所以就是两个反演圆的外公切线了(不可以是内公切先,画画图就明白了). 1 #include<bits/stdc++.h>

ZROI 19.08.02 计算几何

1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识) 给一个序列,每个位置表示旋转.反射.平移中的一种,求\((x,y)\)经过序列\([l,r]\)的点. 线段树维护矩乘就好了,矩阵里需要带个常数位置. Simpson积分 不会积分,告辞. 2.简单题 求点\(p\)在直线\(p_1p_2\)上的投影. 投影就是点积,直接积就行了,必修四怎么学的

HDU5130 Signal Interference

1 /* 2 HDU5130 Signal Interference 3 http://acm.hdu.edu.cn/showproblem.php?pid=5130 4 计算几何 圆与多边形面积交 5 * 6 */ 7 8 9 #include <cstdio> 10 #include <algorithm> 11 #include <cmath> 12 using namespace std; 13 const double Pi=acos(-1.0); 14 co

快速傅立叶变换(FFT)相关内容汇总

FFT是近年考察非常频繁的算法,与其相关的知识点也相当多样. 这里主要是资料汇总,内容补充和总结等.具体应用应在各大OJ上做相关题目. 目录: 概述 1. 前置技能:数学基础 1.1 多项式概念与运算. 1.2 微积分初步与泰勒展开 1.3 普通型生成函数与指数型生成函数 1.4 线性代数相关(矩阵,行列式与特征多项式) 1.5 组合数与伯努利数 1.6 常系数齐次线性递推 1.7 初等数论与初等代数 1.8 卷积概念与O(n^2)求法 1.9 拉格朗日插值法 2. FFT:快速傅立叶变换算法总