【bzoj1502】 NOI2005—月下柠檬树
http://www.lydsy.com/JudgeOnline/problem.php?id=1502 (题目链接)
今天考试题,从来没写过圆的面积之类的东西。。GG
题意
一颗树由n个圆台组成,现在有倾斜角为alpha的光,不计树干阴影,光线沿直线传播,求这个树在水平地面投影的面积。
Solution
Simpson积分法。
直接蒯一份题解算了(http://blog.csdn.net/ww140142/article/details/48296273),反正也看不懂。。看来只能背代码了
给出一颗树。。求这棵树的阴影面积。。。
什么鬼题!= =
当然这是一道计算几何;
首先我们把树的尖看成半径为0的圆;
三维图形到二维的投影貌似很难啊,不过这题也有很多特殊性;
因为圆对于平行的面的投影都是相同的正圆,所以可以直接投在地面上;
而圆心距则是除了一个tan函数的样子,所以圆已经被扔到待求的平面上了;
这些圆的公切线!(这样就从母的变成公的啦233)
公切线的求法就是画图上勾股定理相似乱搞,调两组数据改改就好了;
然后正解似乎是讨论了一堆东西然后分别求面积;
然后我们似乎可以直接上Simpson积分!
具体细节不说了,代码里都有;
这题精度不是特别卡,EPS=1e5就够了?
当然,我写的是1e7= =。
代码
// bzoj1502
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<vector>
#define eps 1e-7
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=510;
struct S {double x,y,p,q;}c[maxn];
double h[maxn],s[maxn],r[maxn],alpha,ll,rr;
int n,size=0; double sqr(double x) {return x*x;}
double f(double l) {
double t=0.0;
for (int i=1;i<=n;i++)
if (fabs(s[i]-l)<r[i]) t=max(t,sqrt(sqr(r[i])-sqr(s[i]-l)));
for (int i=1;i<=size;i++)
if (c[i].x<l && l<c[i].p) t=max(t,c[i].y+(c[i].q-c[i].y)*(l-c[i].x)/(c[i].p-c[i].x));
return t;
}
double Simpson(double l,double r,double fl,double fmid,double fr) {
double m=(l+r)/2;
double p=f((l+m)/2),q=f((m+r)/2);
double x=(fl+4*fmid+fr)*(r-l)/6,y=(fl+4*p+fmid)*(m-l)/6,z=(fmid+4*q+fr)*(r-m)/6;
if (fabs(x-y-z)<eps) return y+z;
return Simpson(l,m,fl,p,fmid)+Simpson(m,r,fmid,q,fr);
}
int main() {
scanf("%d%lf",&n,&alpha);
alpha=1.0/tan(alpha);
for (int i=1;i<=n+1;i++) {
scanf("%lf",&h[i]);
h[i]+=h[i-1];
s[i]=h[i]*alpha;
}
ll=0;rr=0;
for (int i=1;i<=n;i++) {
scanf("%lf",&r[i]);
ll=min(ll,s[i]-r[i]);
rr=max(rr,s[i]+r[i]);
}
r[n+1]=0;
for (int i=1;i<=n;i++) {
double d=s[i+1]-s[i];
if (d>fabs(r[i]-r[i+1])) {
c[++size].x=s[i]-r[i]*(r[i+1]-r[i])/d;
c[size].y=sqrt(sqr(r[i])-sqr(c[size].x-s[i]));
c[size].p=s[i+1]-r[i+1]*(r[i+1]-r[i])/d;
c[size].q=sqrt(sqr(r[i+1])-sqr(c[size].p-s[i+1]));
}
}
rr=max(rr,s[n+1]);
printf("%.2lf",2*Simpson(ll,rr,0,f((ll+rr)/2),0));
return 0;
}
【bzoj1502】 NOI2005—月下柠檬树的更多相关文章
- BZOJ1502: [NOI2005]月下柠檬树
Simpson法相当好用啊!神奇的骗分算法! /************************************************************** Problem: 1502 ...
- [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法
关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- [NOI2005]月下柠檬树[计算几何(simpson)]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1169 Solved: 626[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]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- BZOJ1502:[NOI2005]月下柠檬树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1502 https://www.luogu.org/problemnew/show/P4207 李哲 ...
随机推荐
- OXM
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...
- Xcode7 真机调试步骤以及遇到的问题解决办法
打开Xcode7,打开preference 添加自己的apple ID登陆上去 打开一个自己的想要运行在真机上的项目 插上自己的iPhone真机(真机没必要是最新的系统,没必要升级,我刚开始报错以为是 ...
- Go Walk教程 - 流程控制( switch)
Go的 switch 非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项,不要break: var score =98 var result string switch score/ ...
- C语言 百炼成钢11
//题目31:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 //判断第二个字母. #define _CRT_SECURE_NO_WARNINGS #include<st ...
- 通过HttpClient来调用Web Api接口~续~实体参数的传递
并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数 ...
- [vim]的关键字补全
除了complete关键字补全,所有补全相关命令都以CTRL-X开始,然后再接与补全类型相关的命令.CTRL-N与CTRL-P在找的的内容中选择的通用的命令,上下选择用的,CTRL-E则是取消选择.( ...
- Java集合---HashSet的源码分析
一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二. ...
- initializer for conditional binding must have optional type not AVAudioPlayer
if let buttonBeep = self.setupAudioPlayerWithFile("ButtonTap", type: "wav") { ...
- CUDA编程学习(三)
我们知道一个grid包含多个block,而一个block又包含多个thread,下面将是如何进行下thread中的并行. /**** Splot a block into parallel threa ...
- Mysql-proxy中的lua脚本编程(一)
在为mysql-proxy编写lua脚步的时候,需要知道一下几个入口函数,通过这几个入口函数我们可以控制mysql-proxy的一些行为. connect_server() 当代理服 ...