BZOJ 1502 月下柠檬树(simpson积分)
题目链接: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积分)的更多相关文章
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- bzoj 1502 月下柠檬树【Simpson积分】
投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的. 公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆 然后simpson即 ...
- 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分
特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- 【bzoj 1502】月下柠檬树
月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...
- [BZOJ1502]月下柠檬树(自适应辛普森积分)
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status] ...
随机推荐
- idea新建项目完整过程
参看下面博客 http://www.cnblogs.com/cnjava/archive/2013/01/29/2881654.html 突然,感觉idea其实挺麻烦的: 一.junit test做起 ...
- GDI+的常用类
VisualStyleRenderer 提供用于绘制和获取有关 System.Windows.Forms.VisualStyles.VisualStyleElement 的信息的方法. VisualS ...
- Kali Linux 命令集
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- JavaScript之常用方法讲解
1.indexOf() 定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,frominde ...
- css之margin && padding讲解
margin && padding盒子模型: margin是模块与模块的空隙,padding是内容与边框的空隙 注: 1.margin:边缘.空白 2.padding:填充 margi ...
- pragma伪指令
pragma伪指令 通过pragma伪指令告诉编译器如何对待特定的函数.对象或代码段.TMS320C28x C/C++编译器支持如下形式的pragma伪指令: CODE_SECTION(func,“s ...
- int型整数的数值范围
假设int型用两个字节表示对于有符号的整数,用补码表示的话,最高位是符号位,后面15位用来表示数据.1.正数,表示的范围为0000 0000 0000 0001-0111 1111 1111 1111 ...
- AJAX实现仿Google Suggest效果
修复了一些细节代码(支持持续按键事件) *项目名称:AJAX实现类Google Suggest效果*作者:草履虫(也就是蓝色的ecma)*联系:caolvchong@gmail.com*时间:2007 ...
- css 内联元素inline 行框全解
首先看一篇文章: CSS框模型:一切皆为框 — 从行框说起 一 行框 看图说话 上图代表了框模型中的行框.line-height 属性设置行间的距离(行高).该属性会影响行框的布局.在应用到一个块级元 ...
- Guava官方文档-RateLimiter类
转载自并发编程网 – ifeve.com RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证.如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证 ...