bzoj 1502 月下柠檬树【Simpson积分】
投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的。
公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆
然后simpson即可
eps大概1e-6
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1005;
const double eps=1e-6,inf=1e15;
double alp;
int n,m,num;
struct dian
{
double x,y;
dian (double X=0,double Y=0)
{
x=X; y=Y;
}
};
struct yuan
{
double r;
dian c;
yuan(dian a=(dian){0,0},double R=0)
{
c=a; r=R;
}
}a[N];
struct xian
{
dian s,t;
double k,b;
xian(dian S=(dian){0,0},dian T=(dian){0,0})
{
s=S,t=T;
if(s.x>t.x) swap(s,t);
k=(s.y-t.y)/(s.x-t.x);
b=s.y-k*s.x;
}
double f(double x)
{
return k*x+b;
}
}l[N];
int cmp(double x)
{
if(fabs(x)<eps)
return 0;
return x<0? -1:1;
}
double f(double x)
{
double re=0;
for(int i=1;i<=n;i++)
{
double d=fabs(x-a[i].c.x);
if(cmp(d-a[i].r)>0)
continue;
double len=2*sqrt(a[i].r*a[i].r-d*d);
re=max(re,len);
}
for(int i=1;i<=num;i++)
if(x>=l[i].s.x && x<=l[i].t.x)
re=max(re,2*l[i].f(x));
return re;
}
double sps(double l,double r,double now,double fl,double fr,double fm)
{//cout<<l<<" "<<r<<endl;
double mid=(l+r)/2,ffl=f((l+mid)/2),ffr=f((mid+r)/2),p=(fl+fm+ffl*4)*(mid-l)/6,q=(fm+fr+ffr*4)*(r-mid)/6;
if(cmp(now-p-q)==0)
return now;
else
return sps(l,mid,p,fl,fm,ffl)+sps(mid,r,q,fm,fr,ffr);
}
int main()
{
scanf("%d%lf",&n,&alp);
double h,r;
for(int i=1;i<=n+1;i++)
{
scanf("%lf",&h),
a[i]=(yuan){((dian){(h/tan(alp))+a[i-1].c.x,0}),0};
}
for(int i=1;i<=n;i++)
scanf("%lf",&r),a[i].r=r;
double L=inf,R=-inf;
for(int i=1;i<=n+1;i++)
L=min(L,a[i].c.x-a[i].r),R=max(R,a[i].c.x+a[i].r);
for(int i=1;i<=n;i++)
{
double d=a[i+1].c.x-a[i].c.x;
if(cmp(d-fabs(a[i].r-a[i+1].r))<0) continue;
double sina=(a[i].r-a[i+1].r)/d,cosa=sqrt(1-sina*sina);
l[++num]=(xian){(dian){a[i].c.x+a[i].r*sina,a[i].r*cosa},(dian){a[i+1].c.x+a[i+1].r*sina,a[i+1].r*cosa}};
}
// printf("%.2lf\n",Simpson(L,R,Calc(L,R)));
double fl=f(L),fr=f(R),fm=f((L+R)/2);
printf("%.2lf\n",sps(L,R,(fl+4*fm+fr)*(R-L)/6,fl,fr,fm));
return 0;
}
/*
2 0.72953
9.61090 0.26021 4.47090
2.98979 2.00036
*/
bzoj 1502 月下柠檬树【Simpson积分】的更多相关文章
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分
特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- 【bzoj 1502】月下柠檬树
月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...
- [BZOJ1502]月下柠檬树(自适应辛普森积分)
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status] ...
随机推荐
- HDU 1114 【DP】
题意: 给你空钱袋的质量和装满钱的钱袋的质量. 给你先行的n种货币的面值和质量. 问钱包里的钱最少是多少. 如果质量不可行,输出impossible. 思路: 完全背包. 屌丝有个地方没想通,就是如何 ...
- 实时更新数据的jQuery图表插件DEMO演示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- DTrace C++ Mysteries Solved 转
I’ve been using DTrace on Leopard in my recent work, and while it’s a great tool, the C++ support ...
- Meteor第一个应用程序
这一个小教程将教你如何建立你的第一个 Meteor 应用程序. 步骤 1 - 创建App 要创建应用程序,我们将从命令提示符窗口运行 meteor create 命令.该应用程序的名称是 meteor ...
- Desert King (poj 2728 最优比率生成树 0-1分数规划)
Language: Default Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22113 A ...
- 分享:Mac与Phy组成原理的简单分析
原文链接:http://blog.chinaunix.net/uid-20528014-id-3050217.html 1.General 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成. ...
- android 开发中用到的工具-持续更新(码农必看)
1. vim 单文件查看改动利器(一直使用支持各种编码各种文件,各种插件),欢迎下载笔者插件 git clone https://github.com/green130181/vim-conf.git ...
- [转] When to use what language and why
Published by Seraphimsan Oct 13, 2010 (last update: Oct 14, 2010) When to use what language and why ...
- 图像配准建立仿射变换模型并用RANSAC算法评估
当初选方向时就由于从小几何就不好.缺乏空间想像能力才没有选择摄影測量方向而是选择了GIS. 昨天同学找我帮他做图像匹配.这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人.于是乎就看着他 ...
- Django值中间件
1,还是那句话:写代码的逻辑遵循:简洁,重复性高,可维护性高 1.1>中间件:中间件是一种用来处理Django的请求和响应的框架级别的钩子.它是一个轻量,低级别的插件系统,用于在全局范围内改变D ...