【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 李哲 ...
随机推荐
- DragRigidbody2D
组件源码 using UnityEngine; using System.Collections; //This script allows to drag rigidbody2D elements ...
- $apply方法的作用
$apply方法是用来触发脏检查,它在控制器里监听一个变量,每当这个变量的值改变的时候,它会去与最初的值做一次比较,然后HTML页面就会及时更新该变量的值(将最新的值赋值到html页面的view层或M ...
- mysqli_stmt预处理类
<?php $mysqli=new mysqli("localhost", "root", "123456", "xsph ...
- angularjs: ng-select和ng-options
angular.js有一个很强大的指令: ng-select 它可以帮助你通过数据模型来创建select元素.它很好的支持了select标签的语法,但是却有点坑. 假设有如下一段json数据: { & ...
- System.Net.Sockets.Socket SendAsync System.ObjectDisposedException: Cannot access a disposed object.
发生未处理的域异常! System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net ...
- js 方法重载
function fun1(arm1) { alert(arm1); } function fun2(arm1, arm2) { alert(arm1 + "_" + arm2); ...
- wireshark添加ip.id字段
wireshark添加ip.id字段 为了在多个设备上追踪同一个数据包. 如果是同一个会话,则可以计算延迟, 如sta和应用服务器慢,这种问题,可以根据这个加上ip.id追踪数据到哪里慢了.
- 修改Tomcat可支持get形式url长度
maxHttpHeaderSize="8192" 加在 <Connector port="8081" maxHttpHeaderSize="31 ...
- C# LUA 闭包
许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果. //LUA------------------------------------------------ ...
- PHP基础12:数组
<?php //1.实例 $array = array("VOLVO","BMW","SASS"); for ($i=0; $i &l ...