【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 李哲 ...
随机推荐
- You are note Hk
直接打开是forbidden 最后一句话提示 于是改包 第二次还是修改包 Mozilla/5.0 (MSIE 7.0; Windows NT 6.0;.NET CLR 9.9)
- android studio 导入工程问题总结
github上下了几个开源项目,在导入android studio时出现各种问题, 在网上查询各种资料后一一得以解决,现对个问题点进行简单的总结: 1. gradle project sync fai ...
- FMDB 使用方法
优秀的第三方库,README 也是很优秀的,理解了 README,会对使用带来很多便利. ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目 ...
- 阻塞与非阻塞IO step by step
谈到IO,阻塞.非阻塞,异步.同步是绕不开的话题.说实话,我也没搞清楚,网上查了许多资料,大家众说纷纭,一种比较靠谱的说法是:”在处理 IO 的时候,阻塞和非阻塞都是同步 IO,使用使用了特殊的API ...
- SQL 时间处理
1.获取当前时间 GetDate() 2.获取当前年.月.日 DATEPART(yyyy,GetDate()).DATEPART(m,GetDate()).DATEPART(d,GetDate()) ...
- LUA GC 简单测试
function table.count(t) if type(t) ~= "table" then assert(false) return end for k, _ in pa ...
- 构建基于WCF Restful Service的服务
前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便), ...
- [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this p ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- java 中Handler 和Runnable 的使用 异步发送消息 转
public class MainActivity extends Activity { TextView text1, text2; Button button; Thread th; @Overr ...