李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地
坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理。李哲是一个喜爱思考的孩子,当他看到在月光的照射下
柠檬树投在地面上的影子是如此的清晰,马上想到了一个问题:树影的面积是多大呢?李哲知道,直接测量面积是
很难的,他想用几何的方法算,因为他对这棵柠檬树的形状了解得非常清楚,而且想好了简化的方法。李哲将整棵
柠檬树分成了n 层,由下向上依次将层编号为1,2,…,n。从第1到n-1 层,每层都是一个圆台型,第n 层(最上面一
层)是圆锥型。对于圆台型,其上下底面都是水平的圆。对于相邻的两个圆台,上层的下底面和下层的上底面重合
。第n 层(最上面一层)圆锥的底面就是第n-1 层圆台的上底面。所有的底面的圆心(包括树顶)处在同一条与地面垂
直的直线上。李哲知道每一层的高度为h1,h2,…,hn,第1 层圆台的下底面距地面的高度为h0,以及每层的下底面
的圆的半径r1,r2,…,rn。李哲用熟知的方法测出了月亮的光线与地面的夹角为alpha。

为了便于计算,假设月亮的光线是平行光,且地面是水平的,在计算时忽略树干所产生的影子。
李哲当然会算了,但是他希望你也来练练手

Input
第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度)。
第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的高度和每层的高度。
第3行包含n个实数r1,r2,…,rn,表示柠檬树每层下底面的圆的半径。
上述输入文件中的数据,同一行相邻的两个数之间用一个空格分隔。
输入的所有实数的小数点后可能包含1至10位有效数字。
1≤n≤500,0.3<alpha<π/2,0<hi≤100,0<ri≤100

Output
输出1个实数,表示树影的面积。四舍五入保留两位小数。

Sample Input
2 0.7853981633
10.0 10.00 10.00
4.00 5.00

Sample Output
171.97

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 1010
#define INF 1e12
#define eps 1e-5
double alpha;
int n,num;
struct Point{ double x,y; Point(double X=0,double Y=0){x=X;y=Y;}
};
struct Circle{ double r; Point c; Circle(Point C=(Point){0,0},double R=0){c=C;r=R;}
}C[maxn];
struct Line{ Point s,t; double k,b; Line(Point S=(Point){0,0},Point T=(Point){0,0}){ s=S,t=T; if(s.x>t.x) swap(s,t); k=(s.y-t.y)/(s.x-t.x); b=s.y-k*s.x; } double f(double x){return k*x+b;}
}l[maxn];
int dcmp(double x){if(fabs(x)<eps) return 0; return x<0?-1:1;}
double F(double x){ double re=0; for(int i=1;i<=n;i++){ //枚举圆是否与扫描线有交double d=fabs(x-C[i].c.x); if(dcmp(d-C[i].r)>0) continue; double len=2*sqrt(C[i].r*C[i].r-d*d); re=max(re,len);  } for(int i=1;i<=num;i++) if(x>=l[i].s.x && x<=l[i].t.x) re=max(re,2*l[i].f(x)); //枚举公切线return re;
} //利用扫描线去判断
double Calc(double l,double r) {double mid=(l+r)/2; return (F(l)+F(r)+F(mid)*4)*(r-l)/6;}
double Simpson(double l,double r,double now){ double mid=(l+r)/2; double x=Calc(l,mid),y=Calc(mid,r); if(!dcmp(now-x-y)) return now; return Simpson(l,mid,x)+Simpson(mid,r,y);
}
void Solve(){ double L=INF,R=-INF; for(int i=1;i<=n+1;i++) L=min(L,C[i].c.x-C[i].r),R=max(R,C[i].c.x+C[i].r); for(int i=1;i<=n;i++){ double d=C[i+1].c.x-C[i].c.x;  if(dcmp(d-fabs(C[i].r-C[i+1].r))<0) continue; //特判小圆被大圆覆盖的情况//求两圆的公切线,画图很容易算出 double sina=(C[i].r-C[i+1].r)/d,cosa=sqrt(1-sina*sina);  l[++num]=(Line){(Point){C[i].c.x+C[i].r*sina,C[i].r*cosa},(Point){C[i+1].c.x+C[i+1].r*sina,C[i+1].r*cosa}}; } printf("%.2lf\n",Simpson(L,R,Calc(L,R)));
}
int main() { scanf("%d%lf",&n,&alpha); double h,r; for(int i=1;i<=n+1;i++){scanf("%lf",&h); C[i]=(Circle){((Point){(h/tan(alpha))+C[i-1].c.x,0}),0};}for(int i=1;i<=n;i++) scanf("%lf",&r),C[i].r=r; Solve();return 0;
}

HYSBZ - 1502 月下柠檬树【辛普森积分】相关推荐

  1. bzoj 1502月下柠檬树 Simpson积分

    关键点是,水平的圆投影到水平面之后仍然是与原先全等的圆. 然后圆与圆之间通过曲面无缝连接,所以投影下来之后圆与圆之间通过公切线连接. 直接求有点难.把投影区域的上边界当成一个函数,然后套Simpson ...

  2. BZOJ 1502: [NOI2005]月下柠檬树 simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1244  Solved: 662 [Submit][Statu ...

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 1502:月下柠檬树

    BZOJ 1502:月下柠檬树 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题目大意:给出一棵由圆台构成的树以及一个平行光源,问 ...

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

    P4207 [NOI2005]月下柠檬树 如图,我们要求的面积就是这些圆形跟梯形的组合,由于投射到地面上,显然有h′=htanθh' = \frac{h}{tan \theta}h′=tanθh​,由 ...

最新文章

  1. C# 接口的作用浅谈举例(转)
  2. 关于用函数指针参数申请动态内存的问题
  3. 随手写个二分查找算法【Java】
  4. 如何部署和搭建测试log4j 2
  5. JavaWeb 基础系列篇
  6. [BuildRelease Management]buildbot
  7. 基于堆叠卷积长短期神经网络【CNNLSTM】模型的时序数据预测分析
  8. 关于税控的一些问题总结
  9. 【洛谷试炼场】新手村:洛谷的第一个任务
  10. 大规模sip信令存储、查询和实时跟踪的实现
  11. 电脑技巧:电脑内存不足怎么办?看完你就会了!
  12. 南澳大学计算机科学专业学费,澳洲南澳大学生活费
  13. 微信小程序扫描程序码携带参数
  14. JavaScript进阶(8)-ES6简介及新增let和const关键字
  15. 李福攀:Kata安全容器在蚂蚁集团的应用实践
  16. 利用IMU进行激光点云运动畸变校正
  17. 编写一个求和函数sum,用于计算 1+2+…+n ,在主函数调用该函数求和。
  18. 百度seo快排点击系统源码[易语言]拨号模拟点击(仅供学习使用!)
  19. [macOS]_[Shell]_[获取App的签名证书有效期]
  20. Dream it possible-我的2016

热门文章

  1. 全球化的误区,本地化的机会
  2. 4W2H快速学习方法
  3. 内存不能read 解决办法
  4. 秋招面试 前端问题总结
  5. excel中的常用技巧_在Excel中控制技巧
  6. 12对胸椎对应体表标志_胸部的胸部体表标志
  7. Invalid use of group function解决办法
  8. [BZOJ3876][AHOI2014]支线剧情-有下界的最小费用流
  9. android宿舍管理系统源码,校园宿舍管理系统 - ATB的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 御龙在天手游怎么不显示服务器了,【图片】【御龙在天手游】5月14日【常规服】全区停机更新公告_御龙在天手游吧_百度贴吧...