Description

李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地

坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理。李哲是一个喜爱思考的孩子,当他看到在月光的照射下

柠檬树投在地面上的影子是如此的清晰,马上想到了一个问题:树影的面积是多大呢?李哲知道,直接测量面积是

很难的,他想用几何的方法算,因为他对这棵柠檬树的形状了解得非常清楚,而且想好了简化的方法。李哲将整棵

柠檬树分成了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

Solution

注意到一个圆锥投影下来是一个圆加一个三角形,所以可以知道这个图形的样子。

然后辛普森积分就好了。

为啥我bzoj死活卡不过啊...

打表大法好

#include<bits/stdc++.h>
using namespace std;void read(int &x) {x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}void print(int x) {if(x<0) putchar('-'),x=-x;if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}#define lf doubleconst int maxn = 5e2+10;
const lf eps = 5e-6;int n;
lf h[maxn],rr[maxn],alpha,cot;
struct data {lf l,r,k,b,L,R;
}a[maxn];lf sqr(lf x) {return x*x;}lf f(lf x) {lf ans=0;for(int i=1;i<=n;i++) {lf l=a[i].L,r=a[i].R,t=0;if(l<=x&&x<=r) t=a[i].k*x+a[i].b;else if(x>=a[i].l-rr[i]) t=sqrt(sqr(rr[i])-sqr(a[i].l-x));else if(x<=a[i].r+rr[i+1]) t=sqrt(sqr(rr[i+1])-sqr(x-a[i].r));ans=t>ans?t:ans;}return ans;
}lf _int(lf l,lf r) {return (r-l)*(f(l)+f(r)+4.0*f((l+r)*0.5))/6.0;}lf simpson(lf l,lf r,lf res,lf fl,lf fr) {lf mid=(l+r)*0.5,fmid=f(mid);lf L=(mid-l)*(fl+fmid+4.0*f((l+mid)*0.5))/6.0;lf R=(r-mid)*(fmid+fr+4.0*f((mid+r)*0.5))/6.0;if(fabs(L+R-res)<=eps) return L+R;else return simpson(l,mid,L,fl,fmid)+simpson(mid,r,R,fmid,fr);
}int main() {read(n);scanf("%lf",&alpha);cot=1.0/tan(alpha);for(int i=0;i<=n;i++) scanf("%lf",&h[i]),h[i]+=i?h[i-1]:0;for(int i=1;i<=n;i++) scanf("%lf",&rr[i]);lf l=1e9,r=-1e9;for(int i=1;i<=n;i++) {a[i].l=h[i-1]*cot,a[i].r=h[i]*cot;lf t;if(fabs(rr[i]-rr[i+1])<eps) {a[i].L=a[i].l,a[i].R=a[i].r,a[i].k=0,a[i].b=rr[i];} else {if(rr[i]<rr[i+1]) {lf x=rr[i]*(a[i].r-a[i].l)/(rr[i+1]-rr[i])+a[i].r-a[i].l;t=rr[i+1]/x;a[i].k=rr[i+1]/(x*sqrt(1.00-sqr(rr[i+1]/x)));a[i].b=-a[i].k*(a[i].r-x);} else {lf x=rr[i+1]*(a[i].r-a[i].l)/(rr[i]-rr[i+1])+a[i].r-a[i].l;t=rr[i]/x;a[i].k=-rr[i]/(x*sqrt(1.00-sqr(rr[i]/x)));a[i].b=-a[i].k*(a[i].l+x);}t=sqrt(1-sqr(t));a[i].L=(rr[i]*t-a[i].b)/a[i].k;a[i].R=(rr[i+1]*t-a[i].b)/a[i].k;}l=min(l,a[i].l-rr[i]);r=max(r,a[i].r+rr[i+1]);}printf("%.2lf\n",simpson(l,r,_int(l,r),f(l),f(r))*2);return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10546167.html

[BZOJ1502] [NOI2005]月下柠檬树相关推荐

  1. bzoj1502: [NOI2005]月下柠檬树

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

  2. [BZOJ1502][NOI2005]月下柠檬树(辛普森积分+解析几何)

    题目: 我是超链接 题解: 首先我们理解一下投影的性质,也就是投影出来的图形一定跟原图形全等. 考虑一下圆形投影下来是什么呢?和原来一样的圆形啊 怎么转化竖着的树呢? 也就是树高*cot(α) 那么我 ...

  3. [BZOJ1502][NOI2005]月下柠檬树(辛普森积分)

    === === 这里放传送门 === === 题解 据说这题正解好像是各种分类讨论一块块求面积? 然而一开始知道这题辛普森积分就可以过但是差一点还是写成了那种分类讨论的方法..就一开始非常无脑求了公切 ...

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

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

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

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

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

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

  7. 1502: [NOI2005]月下柠檬树

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

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

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

  9. 1502: [NOI2005]月下柠檬树 - BZOJ

    Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,-,hn,表示树离地的 ...

最新文章

  1. ConcurrentHashMap实现原理及源码分析
  2. 学生每日计划表_早上6:13,很多教室的灯就亮了!高考还有10天,你都想象不到这些学生有多拼...
  3. 关于过滤空格问题(未经测试)
  4. 四层和七层负载均衡的区别介绍--转
  5. dwr和ajax的区别,dwr的ajax实现
  6. yii mysql in,在Yii中从MySQL获取最后插入的ID
  7. WSS3.0开发-过滤列表内容(2)--一个增强的列表元数据查询webpart(SmartQueryWebPart)...
  8. RegExp 误用解析
  9. 网站安全测试报告模板
  10. 基于单片机的GPS开发 (five) GPS数据获取解析思路
  11. 软件工程课程课后大作业
  12. Maven 镜像设置
  13. X86 MOVSB MOVSW MOVSD MOVSQ 指令详解
  14. 美国恐怖故事第一季/全集American Horror Story 1全迅雷下载
  15. 总结一下2010--2011初看的书
  16. sqlserver 联接查询的一些注意点
  17. 1N4148的导通电压
  18. 信息安全工程第四章网络安全体系与网络安全模型要点小结
  19. 别用微信文件传输助手了,这6款在线工具真香
  20. uiuc的计算机工程硕士学费标准,美国计算机硕士留学费用全都在这了!

热门文章

  1. ps3运行linux,PS3上的PC系统Linux不是摆设!
  2. 802.11ax 的OFDMA资源分配详解
  3. CentOS7 中没有显示 ip 地址
  4. dodo:人脸识别方法个人见解(包括稀疏表示方法的理解)
  5. [译] 从原型图到成品:步步深入 CSS 布局
  6. 分布式事务前看懂CAP、BASE
  7. 21点(Blackjack)与概率
  8. PLSQL-Developer工具
  9. 解决AJAX请求使PHP反应时间过长的问题
  10. 什么是域名邮箱?发出的邮件可以撤回吗?