[NOI2005]月下柠檬树[计算几何(simpson)]
1502: [NOI2005]月下柠檬树
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1169 Solved: 626
[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
10.0 10.00 10.00
4.00 5.00
Sample Output
HINT
1≤n≤500,0.3
Source
求一棵树(圆锥加圆台组成)在平面上的投影的面积。
给定投影角度(0.3 < alpha <= pi/2)。
先来想想圆的投影是什么样子
还是他自己。
再想圆锥投影是什么样子
一个点加一个圆,并且有这个点与该圆的两条切线(该点在圆内部时没有切线)
再想圆台
两个圆,加上两个圆的外公切线组成的一坨图形。
不妨随意画一个。
好难画- -!
大概就转化成这个样子了。
观察这个图形…
轴对称啊- -!
首先AC长是圆心距,可求。
AI长是半径差,可求。
所以CI可求。
连接FC,观察△FAC
2*S△FAC=FG*AC=CI*AF
AF为半径,已知。
所以FG可求。
于是AG可求。
A点坐标已知,所以F点坐标已知。
E点,直接相似即可。
或者用射影定理求EF
概述图中,在Rt△ABC中,∠ABC=90°,BD是斜边AC上的高,则有射影定理如下:BD²=AD·CDAB²=AC·ADBC²=CD·AC
#include<cmath>
#include<cstdio>
#include<algorithm>
#define pf(x) ((x)*(x))
using namespace std;
const int N=+;
const double eps=1e-;
typedef pair<double,double> point;
typedef pair<double,double> circle;
struct line{
point s,t;
double k,b;
line(){}
line(point _s,point _t){
s=_s;t=_t;
k=(s.second-t.second)/(s.first-t.first);
b=s.second-s.first*k;
}
const double f(const double x){
return k*x+b;
}
};
int n,n1;double alpha,H[N];
point p;line L[N];circle C[N];
double lb=2e9,rb;
double sina,cosa,tana;
inline void add(const circle &a,const circle &b){
n1++;
sina=(a.second-b.second)/(b.first-a.first);
cosa=sqrt(-pf(sina));
tana=sina/cosa;
L[n1].s=make_pair(a.first+a.second*sina,a.second*cosa);
L[n1].t=make_pair(b.first+b.second*sina,b.second*cosa);
L[n1].k=-tana;
L[n1].b=L[n1].s.second-L[n1].s.first*L[n1].k;
}
inline const double F(const double x){
double re=;
for(int i=;i<=n1;i++) if(x>=L[i].s.first&&x<=L[i].t.first) re=max(re,L[i].f(x));
for(int i=;i<=n;i++) if(x>=C[i].first-C[i].second&&x<=C[i].first+C[i].second) re=max(re,sqrt(pf(C[i].second)-pf(x-C[i].first)));
return re;
}
inline const double simpson(const double l,const double r){
double mid=(l+r)/;
return (F(l)+F(r)+*F(mid))*(r-l)/;
}
inline double asr(double l,double r,double eps,double last){
double mid=(l+r)/;
double L=simpson(l,mid),R=simpson(mid,r);
if(fabs(L+R-last)<=*eps) return L+R+(L+R-last)/;
return asr(l,mid,eps/,L)+asr(mid,r,eps/,R);
}
inline int cmp(const double x){
if(fabs(x)<eps) return ;
return x>?:-;
}
int main(){
scanf("%d%lf",&n,&alpha);
for(int i=;i<=n+;i++) scanf("%lf",&H[i]),H[i]+=H[i-];
for(int i=;i<=n;i++) scanf("%lf",&C[i].second);
double ta=tan(alpha);
p=make_pair(H[n+]/ta,);rb=max(rb,p.first);
double x,r,l,h;
C[n].first=H[n]/ta;
x=C[n].first;r=C[n].second;
lb=min(lb,x-r);
rb=max(rb,x+r);
if(x+r<p.first){
l=pf(r)/(p.first-x);// 射影定理
h=sqrt(pf(r)-pf(l));
L[++n1]=line(make_pair(x+l,h),p);
}
for(int i=n-;i;i--){
C[i].first=H[i]/ta;
x=C[i].first;r=C[i].second;
lb=min(lb,x-r);
rb=max(rb,x+r);
if(cmp(C[i+].first-x-fabs(C[i+].second-r))>)//内含
add(C[i],C[i+]);
}
printf("%.2lf\n",*asr(lb,rb,eps,simpson(lb,rb)));
return ;
}
[NOI2005]月下柠檬树[计算几何(simpson)]的更多相关文章
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- [BZOJ 1502] [NOI2005] 月下柠檬树 【Simpson积分】
题目链接: BZOJ - 1502 题目分析 这是我做的第一道 Simpson 积分的题目.Simpson 积分是一种用 (fl + 4*fmid + fr) / 6 * (r - l) 来拟合 fl ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...
- BZOJ1502:[NOI2005]月下柠檬树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1502 https://www.luogu.org/problemnew/show/P4207 李哲 ...
随机推荐
- MacOS下MySQL配置
先去官网下载一个 MySQL for mac http://www.cnblogs.com/xiaobo-Linux/ 命令行运行终端,运行下面两条命令: 1 2 alias mysql=/usr/l ...
- Loadrunner对https协议(单双向SSL)的web端性能测试
1.项目背景 1.1 单双向SSL的含义及部署 单向SSL即我们说到的https协议. 特点是,浏览器需要请求验证服务器证书: 基本含义是:一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务 ...
- V8学习资源
http://wenku.baidu.com/link?url=7mk6ib9IJ-1K_-bFVZ-fXXo2nbI3jOJ3cnhr3XC3b08fPOKkc9v8vSAd-DgNMJZ2vdjg ...
- php解析mpp文件中的前置任务
获取层级的project任务 参考 启动javabridge java -jar JavaBridge.jar SERVLET_LOCAL:8089 1.读取mpp文件 $file_path = & ...
- 数据库事务MTDC出错解决办法
Communication with the underlying transaction manager has failed 与基础事务管理器的通信失败 排除步驟: 1.檢查MS DTC 設置.[ ...
- [原]巧用RenderTexture
郑重声明:转载请注明出处 U_探索 本文诞生于面试过程中这道题:NGUI如何制作3D角色的显示.(大概是这样) 呵呵 没事出去面试面试,考核考核自己也是一种不错的方式哦!不过现在u3d面试,貌似比以 ...
- [OpenCV] Samples 02: Mat - 图像矩阵
前言 一.简介 Ref:IplImage, CvMat, Mat 的关系 Mat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的cvMat和lplImage. 相比之下Ma ...
- Android图片处理(Matrix,ColorMatrix) - 转载
Android图片处理(Matrix,ColorMatrix) 转载自:http://www.cnblogs.com/leon19870907/articles/1978065.html 在编程中有时 ...
- C#静态构造函数调用机制
https://blog.csdn.net/cjolj/article/details/56329230 若一个类中有静态构造函数,在首次实例化该类或任何的静态成员被引用时,.NET自动调用静态构造函 ...
- OC中Runtime浅析
近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...