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

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

首先,做这题需要知道一点:一个圆从任意一个角度投影都永远是一个圆。

我们可以画出一个简图如下:

如图,这棵树倒影之后,有图中两个圆心p1,p2,他们的横坐标即为这颗树上他们原先的高度乘以cotΘ,而他们的半价却不会变化,因为月光是平行光,所以在圆面与地面平行时,两点间距离不会变化。

如图,倒影最终是圆和他们之间的公切线构成的图形,最右边的点可以看做是半径为eps的圆。之后,可以利用simpson积分公式计算,simpson(l,r)=(f(l)+f(r)+4*f(mid))*(r-l)/6,若是精度差距大可以继续递归,注意:本题的eps要1e-6以下才能过。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
const double eps=1e-;
struct Point{
double x,y;
Point(){};
Point(double x0,double y0):x(x0),y(y0){};
}e[],s[],a[],b[];
int n;
double sqr(double x){
return x*x;
}
void cal(Point &s,Point &e,Point a,Point b){
if (std::fabs(a.y-b.y)<eps){
s=a;
e=b;
return;
}
double x0=a.x-a.y*(b.x-a.x)/(b.y-a.y);
double k=a.y/(a.x-x0);
s.x=a.x-k*a.y;
s.y=sqrt(sqr(a.y)-sqr(a.x-s.x));
e.x=b.x-k*b.y;
e.y=sqrt(sqr(b.y)-sqr(b.x-e.x));
}
double f(double x){
double y=;
for (int i=;i<=n+;i++)
if (std::fabs(x-a[i].x)<=a[i].y)
y=std::max(y,sqrt(sqr(a[i].y)-sqr(std::fabs(x-a[i].x))));
for (int i=;i<=n;i++)
if (a[i+].x-a[i].x-std::fabs(a[i].y-a[i+].y)>eps&&x>=s[i].x&&x<=e[i].x){
y=std::max(y,s[i].y+(x-s[i].x)*(e[i].y-s[i].y)/(e[i].x-s[i].x));
}
return y;
}
double work(double L,double R){
double mid=(L+R)/;
return (f(L)+f(R)+f(mid)*)*(R-L)/;
}
double simpson(double L,double R){
double mid=(L+R)/;
double x1=work(L,mid),x2=work(mid,R),x3=work(L,R);
if (std::fabs(x1+x2-x3)<eps) return x1+x2;
else return simpson(L,mid)+simpson(mid,R);
}
int main(){
double theta;
scanf("%d%lf",&n,&theta);
theta=/(tan(theta));
double h=;
for (int i=;i<=n+;i++){
scanf("%lf",&a[i].x);
h+=a[i].x;
a[i].x=h*theta;
}
for (int i=;i<=n;i++)
scanf("%lf",&a[i].y);
a[n+].y=a[n+].y=;
double L=a[].x,R=a[n+].x;
for (int i=;i<=n;i++){
L=std::min(a[i].x-a[i].y,L);
R=std::max(a[i].x+a[i].y,R);
if (a[i+].x-a[i].x-std::fabs(a[i+].y-a[i].y)>eps){
cal(s[i],e[i],a[i],a[i+]);
}
}
printf("%.2f\n",*simpson(L,R));
}

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

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

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

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

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

  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. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  2. Qt的Script、Quick、QML的关系与总结

    背景 最近在学QML,感觉也不难,就是一直以来接触 Qt 的脚本类的东西的顺序是Script.Quick1.Declarative.Quick2.QML.那么每一个都是干什么的呢,这些东西搞的我有点混 ...

  3. Python 在Visual studio 中做单元测试进行TDD开发

    Unit Tests Steve Dower edited this page on 14 Jul · 3 revisions Pages 38 Home Azure Remote Debugging ...

  4. 从vector容器中查找一个子串:search()算法

    如果要从vector容器中查找是否存在一个子串序列,就像从一个字符串中查找子串那样,次数find()与find_if()算法就不起作用了,需要采用search()算法:例子: #include &qu ...

  5. java中如果需要精确的计算答案,请避免使用double类型与float类型

    double类型与float类型主要用于科学计算与工程计算而设计的,用于二进制浮点计算.对于普通计算通常是结果不准确的,所以对于普通的浮点数的加减法等,解决的方法需要用int,long,BigDeci ...

  6. BZOJ1089: [SCOI2003]严格n元树

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 762  Solved: 387[Submit][Status ...

  7. Android Animations简介

    一 .Animations简介 Animations提供了一系列的动画效果,这些效果可以应用于绝大多数的控件: 二.Animations的分类 第一类:TweenedAnimations,该类Anim ...

  8. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  9. Delphi7下实现HTTP的Post操作 转

    Delphi7下实现HTTP的Post操作 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Gra ...

  10. bzoj2325 [ZJOI2011]道馆之战

    Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个 ...