题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1502

题解:

simpson积分求面积,s = (f(a)+f(b)+4*f(c))/6*Δx ,c=(a+b)/2。

题中的树投影下来是一些圆和相邻圆的公切线组成的一个封闭图形,并且上下对称,所以可以只求上半部分。

simpson求面积时,若f(x)代价很大,要尽量减少其的重复调用。其次尽量优化f(x)函数的计算。

写完后还要自己出极限随机数据,将eps调到能接受的最大值。

 #include <cstdio>
#include <cmath>
#include <iostream>
#define maxn 510
#define eps 1e-6
using namespace std; int sg( double x ) {
return (x>-eps)-(x<eps);
}
struct Vector {
double x, y;
Vector(){}
Vector( double x, double y ) : x(x), y(y) {}
Vector operator+( Vector b ) { return Vector(x+b.x,y+b.y); }
Vector operator-( Vector b ) { return Vector(x-b.x,y-b.y); }
Vector operator*( double b ) { return Vector(x*b,y*b); }
double len() {
return sqrt( x*x+y*y );
}
};
typedef Vector Point; struct Line {
Point A, B;
double k, b;
double lf, rg;
Line(){}
Line( Point A, Point B ):A(A),B(B) {
if( A.x>B.x ) swap(A,B);
lf = A.x;
rg = B.x;
k = (B.y-A.y)/(B.x-A.x);
b = A.y-A.x*k;
}
inline bool in( double x ) {
return sg(x-lf)>= && sg(rg-x)>=;
}
inline double f( double x ) { return k*x+b; }
void out() {
printf( "(%lf,%lf) (%lf,%lf) \n", A.x, A.y, B.x, B.y );
}
};
struct Circle {
Point C;
double r;
double lf, rg;
Circle(){}
void make() {
lf = C.x-r;
rg = C.x+r;
}
inline bool in( double x ) {
return sg(x-lf)>= && sg(rg-x)>=;
}
inline double f( double x ) {
return sqrt( r*r-(C.x-x)*(C.x-x) );
}
void out() {
printf( "(%lf,%lf) r=%lf\n", C.x, C.y, r );
}
}; int n;
double alpha;
Line lines[maxn];
Circle cirs[maxn]; Line cir_tang( Circle & a, Circle & b ) {
double ang = acos( (a.r-b.r)/(b.C.x-a.C.x) );
Point A = a.C + Vector(cos(ang),sin(ang))*a.r;
Point B = b.C + Vector(cos(ang),sin(ang))*b.r;
return Line(A,B);
} double F( double x ) {
double y = -1.0;
for( int i=; i<=n; i++ ) {
if( cirs[i].lf-eps<=x && x<=cirs[i].rg+eps )
y = max( y, cirs[i].f(x) );
if( i&& lines[i].lf-eps<=x && x<=lines[i].rg+eps )
y = max( y, lines[i].f(x) );
}
return y;
}
inline double simpson( double a, double b, double fa, double fb, double fc ) {
return (fa+*fc+fb)*(b-a)/;
}
double adapt( double a, double b, double c, double fa, double fb, double fc ) {
double d = (a+c)/, e = (c+b)/;
double fd = F(d), fe = F(e);
double sa = simpson(a,c,fa,fc,fd);
double sb = simpson(c,b,fc,fb,fe);
double ss = simpson(a,b,fa,fb,fc);
if( fabs(sa+sb-ss)<*eps ) return sa+sb;
return adapt(a,c,d,fa,fc,fd)+adapt(c,b,e,fc,fb,fe);
} int main() {
scanf( "%d%lf", &n, &alpha );
double k = /tan(alpha);
double hsum = 0.0, h;
double lf=1e200, rg=-1e200;
for( int i=; i<=n; i++ ) {
scanf( "%lf", &h );
hsum += h;
cirs[i].C.x = hsum*k;
cirs[i].C.y = 0.0;
}
for( int i=; i<n; i++ ) {
scanf( "%lf", &cirs[i].r );
cirs[i].make();
lf = min( lf, cirs[i].lf );
rg = max( rg, cirs[i].rg );
}
cirs[n].r = 0.0;
rg = max( rg, cirs[n].C.x );
for( int i=; i<=n; i++ )
lines[i] = cir_tang( cirs[i-], cirs[i] );
printf( "%.2lf\n", adapt(lf,rg,(lf+rg)/,F(lf),F(rg),F((lf+rg)/) )* );
}

bzoj1502 simpson求面积的更多相关文章

  1. poj 3348--Cows(凸包求面积)

    链接:http://poj.org/problem?id=3348 Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:  ...

  2. P - Atlantis - hdu1542(求面积)

    题意:rt 求面积......不计算重复面积(废话..)hdu1255 的弱化版,应该先做这道题在做那道题的. ******************************************** ...

  3. 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。

    class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Re ...

  4. HDU - 1255 覆盖的面积 (线段树求面积交)

    https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...

  5. 覆盖的面积 HDU - 1255(扫描线求面积交)

    题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时  的情况, 所以就要用到一个临时 ...

  6. hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

  7. 两条线段求交点+叉积求面积 poj 1408

    题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...

  8. 牛客训练二:处女座的签到题(STL+精度+三角形求面积公式)

    题目链接:传送门 知识点: (1)三个点,三角形求面积公式 (2)精度问题: double 15-16位(参考文章) float 6-7位 long long 约20位 int 约10位 unsign ...

  9. Herding(hdu4709)三点运用行列式求面积

    Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. jQuery实现简单前端搜索功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. juery获取元素的方法

    1 从集合中通过指定的序号获取元素 html: 复制代码 代码如下: <div> <p>0</p> <p>1</p> <p>2& ...

  3. python 之ConfigParser模块学习

    1.1 读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该secti ...

  4. 第一天开始使用Oracle

    上半年虽然已经学习了Oracle,但是基本上实验课都没怎么实践过,感觉自己之前过得太水了! 在我的印象里,Oracle 的难度相当于工程师的建设一个亚洲最大的医院一样,也如医生的99%失败率的手术: ...

  5. MYSQL三种安装方式--二进制包安装

    1. 把二进制包下载到/usr/local/src下 2. 如果是tar.gz包,则使用tar zxvf 进行解压 如果是tar包,则可以使用tar xvf 进行解压 3. $ mv mysql-5. ...

  6. centos7安装完成后的一些配置

    1.打开终端 输入 sudo yum -y update 先更新软件包 2.这是输入语言 应用程序->系统工具->设置->区域和语言->+   ->汉语(中国)-> ...

  7. int(long) 类型转换为char

    char类型占一个字节,8位 int类型四个字节32位 (long类型的转换跟int类型相同) #include <stdio.h> ]) { buffer[] = (char)tmp; ...

  8. DBCP object created 日期 by the following code was never closed:

    1.分析 看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步 的分析.我们首先要做的就是想,想想数据库连接池,在 ...

  9. CSU 1102 多连块拼图

    多连块拼图 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述     多连块是指由多个等大正方形边与边连接而成的平面连通图形.         ———— 维基百科      ...

  10. hexdump related.

    hexdump format strings Tue 13 December 2005 In tips. Ian Wienand More from the "things you'd le ...