[NOI2005]月下柠檬树
题意

F.A.Qs | Home | Discuss | ProblemSet | Status | Ranklist | Contest | 入门OJ | ModifyUser autoint | Logout | 捐赠本站 |
---|
Problem 1502. -- [NOI2005]月下柠檬树
1502: [NOI2005]月下柠檬树
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1534 Solved: 813
[Submit][Status][Discuss]
Description

Input
Output
输出1个实数,表示树影的面积。四舍五入保留两位小数。
Sample Input
10.0 10.00 10.00
4.00 5.00
Sample Output
HINT
Source
[Submit][Status][Discuss]
HOME
Back
中文
فارسی
English
ไทย
分析
参照GFY的题解。
首先,做这题需要知道一点:一个圆从任意一个角度投影都永远是一个圆。
我们可以画出一个简图如下:
如图,这棵树倒影之后,有图中两个圆心p1,p2,他们的横坐标即为这颗树上他们原先的高度乘以cotΘ,而他们的半价却不会变化,因为月光是平行光,所以在圆面与地面平行时,两点间距离不会变化。
如图,倒影最终是圆和他们之间的公切线构成的图形,最右边的点可以看做是半径为eps的圆。之后,可以利用simpson积分公式计算,simpson(l,r)=(f(l)+f(r)+4f(mid))(r-l)/6,若是精度差距大可以继续递归,注意:本题的eps要1e-6以下才能过。
时间复杂度?不知道
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
typedef long long ll;
co double eps=1e-6;
co int N=501;
struct Point{
double x,y;
}s[N],e[N],a[N],b[N];
int n;
il double sqr(double x) {return x*x;}
void cal(Point&s,Point&e,Point a,Point b){
if(fabs(a.y-b.y)<eps) return s=a,e=b,void();
double k=(b.y-a.y)/(b.x-a.x);
s.x=a.x-k*a.y,s.y=sqrt(sqr(a.y)-sqr(a.x-s.x));
e.x=b.x-k*b.y,e.y=sqrt(sqr(b.y)-sqr(b.x-e.x));
// s=(Point){a.x-k*a.y,sqrt(sqr(a.y)-sqr(a.x-s.x))};
// e=(Point){b.x-k*b.y,sqrt(sqr(b.y)-sqr(b.x-e.x))};
}
double f(double x){
double y=0;
for(int i=1;i<=n+1;++i)if(fabs(x-a[i].x)<=a[i].y)
y=std::max(y,sqrt(sqr(a[i].y)-sqr(x-a[i].x)));
for(int i=1;i<=n;++i)if(a[i+1].x-a[i].x-fabs(a[i].y-a[i+1].y)>eps&&s[i].x<=x&&x<=e[i].x)
y=std::max(y,s[i].y+(x-s[i].x)*(e[i].y-s[i].y)/(e[i].x-s[i].x));
return y;
}
double work(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 mid=(L+R)/2;
double x1=work(L,mid),x2=work(mid,R),x3=work(L,R);
if(fabs(x1+x2-x3)<eps) return x1+x2;
else return simpson(L,mid)+simpson(mid,R);
}
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
double theta;
scanf("%d%lf",&n,&theta);
theta=1/tan(theta);
double h=0;
for(int i=1;i<=n+1;++i){
scanf("%lf",&a[i].x);
h+=a[i].x,a[i].x=h*theta;
}
for(int i=1;i<=n;++i) scanf("%lf",&a[i].y);
a[n+1].y=a[n+2].y=0;
double L=a[1].x,R=a[n+1].x;
for(int i=1;i<=n;++i){
L=std::min(L,a[i].x-a[i].y),R=std::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) // not in
cal(s[i],e[i],a[i],a[i+1]);
}
printf("%.2lf\n",2*simpson(L,R));
return 0;
}
[NOI2005]月下柠檬树的更多相关文章
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树[计算几何(simpson)]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1169 Solved: 626[Submit][Status] ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...
- 1502: [NOI2005]月下柠檬树 - BZOJ
Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的 ...
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- BZOJ1502:[NOI2005]月下柠檬树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1502 https://www.luogu.org/problemnew/show/P4207 李哲 ...
- 【bzoj1502】 NOI2005—月下柠檬树
http://www.lydsy.com/JudgeOnline/problem.php?id=1502 (题目链接) 今天考试题,从来没写过圆的面积之类的东西..GG 题意 一颗树由n个圆台组成,现 ...
随机推荐
- C#等比例缩放图片
等比例缩放图片(C#) private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth) { try { System.Dr ...
- centos docker 修改默认存储路径
1.修改配置 将--graph /mnt/docker添加在docker.service文件中的ExecStart字段后面,其中/mnt/docker为你需要修改的存储目录 $ vim /usr/li ...
- IDEA中的,让光标回到上一次停留的地方
IDEA中的,光标返回到上一次停留的地方ctrl+alt+ ←IDEA中的,光标返回到下一次停留的地方ctrl+alt+ → 不过要小心,笔记本电脑,默认的翻转屏幕的快捷键和这个冲突..我的选择是关闭 ...
- git使用安装
下载地址 http://msysgit.github.io/ 配置个人的用户名称和电子邮件地址: $ git config --global user.name "runoob" ...
- PAT(B) 1094 谷歌的招聘(Java)
题目链接:1094 谷歌的招聘 (20 point(s)) 题目描述 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com ...
- FFmpeg开发教程一、FFmpeg 版 Hello world
本系列根据项目ffmpeg-libav-tutorial翻译而来 Chapter 0 - 万物之源 -- hello world 然而,本节的程序并不会在终端打印"Hello world&q ...
- PB Event ID 含义 内容浅析
Event ID 含义 内容浅析 event可以用pb自带的id,自动触发事件,而function就需要你去调用了,返回值多种多样 单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetchec ...
- 使用postman mock server
需要写一个小的Java程序,用来调用云平台的接口 由于云平台的接口程序还没有写好,只能用模拟的方式先行开发代码, 用了post来模拟接口程序. 需要模拟的接口如下: ■请求地址 /openapi/ip ...
- cf 869c The Intriguing Obsession
题意:有三种三色的岛,用a,b,c来标识这三种岛.然后规定,同种颜色的岛不能相连,而且同种颜色的岛不能和同一个其他颜色的岛相连.问有多少种建桥的方法. 题解:em....dp.我们先看两个岛之间怎么个 ...
- phpstom激活
phpstom官网:https://www.jetbrains.com/phpstorm/download 激活方法:激活时选择License server 填入http://idea.imsxm.c ...