题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502

题意:给出如下一棵分层的树,给出每层的高度和每个面的半径。光线是平行的,与地面夹角alpha。求树在地面上投影的面积。

思路:样例的投影如下,所有面积就是这些的面积交,包括一些圆、等腰梯形。首先要计算出等腰梯形,也就是两个圆公切线与圆的交点。之后就是simpson公式:

simpson(L,R)表示图形在x=L,x=R与x轴围成图形的面积。若simpson(L,mid)+simpon(mid,R)=simpson(L,R),则直接返回simpson(L,R),否则递归计算rsimpson(L,R)。计算时我们调用的是rsimpson(L,R)。

struct point
{
    double x,y;
    
    void print()
    {
        printf("%lf %lf\n",x,y);
    }
};

int sgn(double x)
{
    if(x>EPS) return 1;
    if(x<-EPS) return -1;
    return 0;
}

point a[N],s[N],e[N];
int n;
double ang;

void cal(point &s,point &e,point a,point b)
{
    if(sgn(a.y-b.y)==0)
    {
        s=a; e=b;
        return;
    }
    double x0=a.x-a.y*(b.x-a.x)/(b.y-a.y);
    double SinAng=a.y/(a.x-x0);
    s.x=a.x-a.y*SinAng;
    s.y=sqrt(sqr(a.y)-sqr(s.x-a.x));
    e.x=b.x-b.y*SinAng;
    e.y=sqrt(sqr(b.y)-sqr(e.x-b.x));
}

double f(double x)
{
    double y=0;
    int i;
    for(i=1;i<=n+1;i++) if(fabs(x-a[i].x)<=a[i].y) y=max(y,sqrt(sqr(a[i].y)-sqr(x-a[i].x)));
    for(i=1;i<=n;i++) if(a[i+1].x-a[i].x-fabs(a[i+1].y-a[i].y)>EPS&&s[i].x<=x&&x<=e[i].x)
    {
        y=max(y,s[i].y+(e[i].y-s[i].y)*(x-s[i].x)/(e[i].x-s[i].x));
    }
    return y;
}

double DFS1(double L,double R)
{
    return (f(L)+4*f((L+R)/2.0)+f(R))*(R-L)/6.0;
}

double DFS(double L,double R)
{
    double mid=(L+R)/2.0;
    double x=DFS1(L,R),y=DFS1(L,mid),z=DFS1(mid,R);
    if(fabs(x-y-z)<EPS) return y+z;
    return DFS(L,mid)+DFS(mid,R);
}

int main()
{
    RD(n); RD(ang); ang=1.0/tan(ang);
    int i;
    double h=0;
    FOR1(i,n+1) RD(a[i].x),h+=a[i].x,a[i].x=h*ang;
    FOR1(i,n) RD(a[i].y); a[i+1].y=0;
    double L=a[1].x,R=a[n+1].x;
    FOR1(i,n)
    {
        L=min(L,a[i].x-a[i].y);
        R=max(R,a[i].x+a[i].y);
        if(a[i+1].x-a[i].x-fabs(a[i+1].y-a[i].y)>EPS)
        {
            cal(s[i],e[i],a[i],a[i+1]);
        }
    }
    PR(2*DFS(L,R));
}

BZOJ 1502 月下柠檬树(simpson积分)的更多相关文章

  1. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

  2. 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分

    [BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...

  3. bzoj 1502 月下柠檬树【Simpson积分】

    投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的. 公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆 然后simpson即 ...

  4. 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分

    特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...

  5. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1070  Solved: 596[Submit][Status] ...

  6. [NOI2005]月下柠檬树(计算几何+积分)

    题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...

  7. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: 562[Submit][Status] ...

  8. 【bzoj 1502】月下柠檬树

    月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...

  9. [BZOJ1502]月下柠檬树(自适应辛普森积分)

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1387  Solved: 739[Submit][Status] ...

随机推荐

  1. html公用库

    <script src="http://lib.sinaapp.com/js/jquery/1.6/jquery.min.js" language="javascr ...

  2. SQL Server优化

    虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/ ...

  3. 最全的CMD命令

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) . appwiz.cpl:程序和功能 . calc:启动计算器 . certmgr.ms ...

  4. 一个perfect 的解决 阴影拉伸的方法 shadow map strech

    因为在场景中做了,有的物体产生阴影比如人物,有的物体不产生阴影比如地面,这样在地面凹下去的地方,悬崖,池塘边,就会有阴影的拉伸. 实际上, 没办法上传图片.... L是光源 A 点(人物身上)产生阴影 ...

  5. 录制iphone手机视频

    1: 升级自己的手机到ios8, 同时mac os也要升级到10.10 2: 用usb数据线将手机连上电脑. 3: 打开quicktime player创建新movie 4: 选择手机作为音频.视频源 ...

  6. 关于WSDL

    Message Operation 最核心的在于Operation 只要关心Operation就可以了,Operation只有Input, Output没有其他内容,是相对固定的.只要关心一下Inpu ...

  7. ol3简介

    ol3从根本上进行了重新设计,相对于ol2,他符合现代浏览器的一些设计理念,使用了js新的特性,initial版本的目的是支持原来ol2的大多数功能,支持公网上流行的缓存切片,支持常见的矢量数据格式. ...

  8. 从浏览器的console获取angularjs的scope

    http://ionicframework.com/blog/angularjs-console/ 1: Access Scopes We can access any scope (even iso ...

  9. Sqli-labs less 42

    Less-42 Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化.在select调用的时候才能发挥作用.所以不用考虑在更新密 ...

  10. 导出含有图片的项目成jar文件后运行,图片不显示

    在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径.这与用户运行Jar包时的当前 ...