1502: [NOI2005]月下柠檬树

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1244  Solved: 662
[Submit][Status][Discuss]

Description

Input

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

Output

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

Sample Input

2 0.7853981633
10.0 10.00 10.00
4.00 5.00

Sample Output

171.97

HINT

1≤n≤500,0.3

这个图好炸了http://blog.csdn.net/wzq_QwQ/article/details/48310417

圆无论怎么搞 还是原来的圆 就是换了位置

圆台的话 就是在上下两个圆之间 加个公切线

可以用simpson积分做 虽然 我觉得很容易卡掉。。。

共切线可以用相似三角形搞

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<set>
#include<map>
using namespace std;typedef double db;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>10)print(x/10);putchar(x%10+'0');}const int N=510,inf=0X3f3f3f3f;
const db eps=1e-6;int lala(int a,int b)
{return max(a,b);}int n;
db alpha,h[N],s[N],R[N];struct tangent_line{db l,r,y[2];}t[N];
int tot;inline db f(db x)
{db res=0;for(int i=1;i<=n;++i)if(s[i]-R[i]<x&&s[i]+R[i]>x)res=max(res,sqrt(R[i]*R[i]-(s[i]-x)*(s[i]-x)));for(int i=1;i<=tot;++i)if(t[i].l<x&&t[i].r>x)res=max(res,t[i].y[0]+(t[i].y[1]-t[i].y[0])*(x-t[i].l)/(t[i].r-t[i].l));return res;
}inline db cal(db fl,db fr,db fmid)
{return (fl+fr+4*fmid)/6.0;}db simpson(db l,db r,db mid,db fl,db fr,db fmid)
{db res=cal(fl,fr,fmid)*(r-l);db resl=f((l+mid)/2.0);db resr=f((mid+r)/2.0);if(abs(cal(fl,fmid,resl)*(mid-l)+cal(fmid,fr,resr)*(r-mid)-res)<eps)return res;return simpson(l,mid,(l+mid)/2.0,fl,fmid,resl)+simpson(mid,r,(mid+r)/2.0,fmid,fr,resr);
}int main()
{n=read();scanf("%lf",&alpha);alpha=1/tan(alpha);for(int i=1;i<=n+1;++i){scanf("%lf",&h[i]);h[i]+=h[i-1];s[i]=h[i]*alpha;}db l=inf,r=-inf;for(int i=1;i<=n;++i){scanf("%lf",&R[i]);l=min(l,s[i]-R[i]);r=max(r,s[i]+R[i]);}r=max(r,s[n+1]);for(int i=1;i<=n;++i)if(abs(R[i]-R[i+1])<s[i+1]-s[i]){db d=s[i+1]-s[i];t[++tot].l=s[i]+R[i]*(R[i]-R[i+1])/d;t[tot].y[0]=sqrt(R[i]*R[i]-(t[tot].l-s[i])*(t[tot].l-s[i]));t[tot].r=s[i+1]+R[i+1]*(R[i]-R[i+1])/d;t[tot].y[1]=sqrt(R[i+1]*R[i+1]-(t[tot].r-s[i+1])*(t[tot].r-s[i+1]));}printf("%.2lf\n",2*simpson(l,r,(l+r)/2.0,0,0,f((l+r)/2.0)));return 0;
}
/*
2 0.7853981633
10.0 10.00 10.00
4.00 5.00171.97
*/

BZOJ 1502: [NOI2005]月下柠檬树 simpson积分相关推荐

  1. BZOJ 1502 NOI2005 月下柠檬树 Simpson自适应公式

    题目大意:给定一棵由圆台和圆锥构成的柠檬树,月光以α的夹角平行射向地面,求阴影部分面积 补充题目大意:看到这题我产生了心理阴影,求阴影部分面积 题目不好分析,但其实就是求一堆圆和一堆梯形的面积交 样例 ...

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

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

  3. BZOJ 1502:月下柠檬树

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

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

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

  5. 【bzoj 1502】月下柠檬树

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

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

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

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

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

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

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

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

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

最新文章

  1. java汉字转换成拼音_Java代码将汉字转换成拼音
  2. 标题h和img优化的技巧
  3. Spring(一)容器
  4. oracle树形语句
  5. Flask 模板 之 变量和过滤器
  6. RayMarching3:组合与变幻
  7. nvm npm node
  8. linux安装quota软件包,CentOS关于quota的总结与实践详解
  9. windows python文件拷贝到linux上执行问题
  10. html代码中数学公式,html中使用mathjax数学公式
  11. ARCore1.2使用入门(一) ------ 将ARCore案例打包成Android/iOS运行测试(unity开发)
  12. Springboot毕设项目房屋租赁系统4yvi2(java+VUE+Mybatis+Maven+Mysql)
  13. 有一个7升的杯子和一个4升的杯子,如何盛出5升水?
  14. windows无法完成安装 若要在此计算机上安装_Win10无法启动,主引导记录(MBR)损坏,用这个方法快速修复...
  15. 支付宝服务商如何帮助商户快速注册支付宝上级和支付宝小程序以及开通支付宝小程序扫码点餐功能
  16. 实验二 译码器及其应用
  17. NLP学习笔记14-语言模型(下)
  18. 对《爱、死亡和机器人》这篇文章的浅思
  19. vux scroller在iOS13上,一停止滑动就跳到顶部
  20. OpenStack 归档 - 虚拟机临时存储与块存储

热门文章

  1. 科研绘图与数据分析软件OriginLab 2021独家获取途径
  2. Linux下TomcatVM参数修改:Native memory allocation (mmap) failed to map 3221225472 bytes for committing res
  3. 公司电脑不可以连外网
  4. Linux 端口详解
  5. web开发不可错过的经典代码20段
  6. java设计模式-观察者模式
  7. gdal支持的栅格影像格式说明
  8. Matlab报错:需要的 第 1 个输入, I or X, 应为 二维
  9. QCC51XX---Earbud启动流程分析
  10. 2020面试题合集之吊打面试官系列(一),kotlin数组性能