題面:
給定n個圓,求其面積並,n<=1000
題目分析:
直接辛普森積分上。。
有乙個優化,預先把被其它圓包含的圓濾去。
(辛普森積分會求很多次一條線上的並,這個優化的效果很明顯,從10000ms+ -> 2500ms)
code:
#include
#include
#include
#define maxn 1005
using
namespace std;
struct point
point
(double x,
double y):x
(x),
y(y)
bool
operator
<
(const point &p)
const
}q[maxn]
;struct circle
}a[maxn]
;const
double eps =
1e-8
, inf =
1e20
, pi =
acos(-
1);int n;
#define sqr(x) (x)*(x)
doublef(
double x)
double l=
-inf,r=
-inf,ret=0;
sort
(q+1
,q+1
+top)
;for
(int i=
1;i<=top;i++)if
(q[i]
.x>r) ret+
=r-l,l=q[i]
.x,r=q[i]
.y;else r=
max(r,q[i]
.y);
return ret+
=r-l;
}double
simpson
(double l,
double m,
double r,
double fl,
double fm,
double fr,
int dep)
inline
double
dist
(circle &a,circle &b)
void
prework()
n=cnt;
}int
main()
bzoj 2178 圓的面積並
給出n個圓,求其面積並 先給乙個數字n n 1000 接下來是n行是圓的圓心,半徑,其絕對值均為小於1000的整數 面積並,保留三位小數 自適應辛普森。留個模板好了 include include include include includeusing namespace std const do...
BZOJ 2178 圓的面積並
description 給出n個圓,求其面積並 題目分析 simpson積分模板題。其實程式有bug,懶得寫了。其實就是不斷的二分,到乙個較小值的時候,就可以了。include include include define f i,j,n for int i j i n i define d i,j...
BZOJ2178 圓的面積並
給出n個圓,求其面積並 先給乙個數字n n 1000 接下來是n行是圓的圓心,半徑,其絕對值均為小於1000的整數 面積並,保留三位小數 直接套 simpson 積分板子就好了,判掉圓包含的情況,然後每次求 f x 的時候直接列舉所有的圓然後掃瞄線暴力搞,因為積分的意義下 f a 的幾何意義就是 x...