【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
【BZOJ1502】[NOI2005]月下柠檬树
Description

Input
Output
输出1个实数,表示树影的面积。四舍五入保留两位小数。
Sample Input
10.0 10.00 10.00
4.00 5.00
Sample Output
题解:简洁题意就是让你求一堆圆和梯形的面积交。
Simpson积分: 
相当于用一个3次函数去拟合所求的图形,可以用于任意连续不规则图形,但是误差很大。自适应simpson积分呢,就是再对f(l,mid)和f(mid,r)分别算一下。如果f(l,mid)+f(mid,r)与f(l,r)误差很小,则直接返回f(l,r),否则继续递归计算。这样误差就比较小了(虽说也可以卡)。
剩下的问题就是如何求两圆的公切线。比较容易的方法是设两圆半径为R,r,先令R'=R-r,r'=0,这样就把第二个圆缩成了一个点,变成求点与圆的切线,再平移回去即可。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#define pi acos(-1.0)
using namespace std;
typedef double db;
const db eps=1e-6;
int n,m;
db alpha,h[510],O[510],R[510],ax[510],ay[510],bx[510],by[510];
inline db f(db x)
{
db ret=0;
int i;
for(i=1;i<=n;i++) if(x>=O[i]-R[i]&&x<=O[i]+R[i])
ret=max(ret,sqrt(R[i]*R[i]-(O[i]-x)*(O[i]-x)));
for(i=1;i<=m;i++) if(x>=ax[i]&&x<=bx[i])
ret=max(ret,ay[i]+(by[i]-ay[i])*(x-ax[i])/(bx[i]-ax[i]));
return ret;
}
inline db simpson(db a,db b)
{
return (b-a)/6*(f(a)+f(b)+f((a+b)/2)*4);
}
inline db calc(db l,db r,db val)
{
db mid=(l+r)/2,a=simpson(l,mid),b=simpson(mid,r);
if(fabs(a+b-val)<eps) return val;
return calc(l,mid,a)+calc(mid,r,b);
}
int main()
{
scanf("%d%lf",&n,&alpha);
int i;
db l=1e9,r=-1e9;
for(i=0;i<=n;i++)
{
scanf("%lf",&h[i]),h[i]/=tan(alpha);
if(i) h[i]+=h[i-1];
}
for(i=1;i<=n;i++)
{
scanf("%lf",&R[i]),O[i]=h[i-1],l=min(l,O[i]-R[i]),r=max(r,O[i]+R[i]);
if(i!=1&&O[i]-O[i-1]>fabs(R[i]-R[i-1]))
{
db a=(R[i-1]-R[i])/(O[i]-O[i-1]),b=sqrt(1-a*a);
ax[++m]=O[i-1]+a*R[i-1],ay[m]=b*R[i-1];
bx[m]=O[i]+a*R[i],by[m]=b*R[i];
}
}
if(h[n]>O[n]+R[n])
{
db a=R[n]/(h[n]-O[n]),b=sqrt(1-a*a);
r=h[n];
ax[++m]=O[n]+a*R[n],ay[m]=b*R[n];
bx[m]=h[n],by[m]=0;
}
printf("%.2lf",calc(l,r,simpson(l,r))*2);
return 0;
}//2 0.7853981633 10.0 10.00 10.00 4.00 5.00
【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分的更多相关文章
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分
特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...
- [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法
关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- BZOJ1502: [NOI2005]月下柠檬树
Simpson法相当好用啊!神奇的骗分算法! /************************************************************** Problem: 1502 ...
- 【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 ...
随机推荐
- Maven Missing artifact jar
maven error:Multiple annotations found at this line: - Missing artifact log4j:log4j:jar:1.2.15:compi ...
- 性能分析Linux服务器CPU利用率
CPU度量 1. 指标范围 1.1 User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...
- 《HTTP权威指南》学习笔记——URL和资源
URL与资源 URL是互联网资源的标准化名称 1.浏览互联网资源 URL是浏览器寻找信息时所需的资源位置 URI是一类更通用的资源标识符,URL是它的子集. URI的两个子集:URL和URN URL提 ...
- 续:纠正:debian【4】可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4【不含4】以上,及 ubuntu 7.04【不含7.04】以上都可以安装!》
关键点: ip a ifconfig -a dhclient ifconfig -a poweroff ip a ifconfig -a apt-get update apt-get install ...
- Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4【不含4】以上,及 ubuntu 7.04【不含7.04】以上都可以安装!
如题. todo 特殊的:ubuntu 16.04 LTS 版本 无法安装成功,原因待查找!!! 最近测试练习安装linux x64上的 oracle10.2.0.5, 都要吐了.
- Spring MVC手札
本文用于记录使用Spring MVC中的零散手札 1.在普通java类中获取HttpServletRequest对象 在web.xml的listener节点加入 <listener> & ...
- VC++调用MSFlexGrid的SetRow方法,出现异常“Invalid Row Value”
MSFlexGrid是微软提供的网格表格控件,SetRow方法用于设置当前焦点所在行. C++ Code 12345 void CMSFlexGrid::SetRow(long nNewVal ...
- [Algorithm] Beating the Binary Search algorithm – Interpolation Search, Galloping Search
From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...
- JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题
项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...
- MongoDB副本集的工作原理
在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据. 备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作, ...