投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的。

公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆

然后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积分】的更多相关文章

  1. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

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

    [BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...

  3. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

  4. 【BZOJ1502】【NOI2005】月下柠檬树 simpson 积分

    特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ...

  5. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1070  Solved: 596[Submit][Status] ...

  6. [NOI2005]月下柠檬树(计算几何+积分)

    题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...

  7. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: 562[Submit][Status] ...

  8. 【bzoj 1502】月下柠檬树

    月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...

  9. [BZOJ1502]月下柠檬树(自适应辛普森积分)

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1387  Solved: 739[Submit][Status] ...

随机推荐

  1. XCode warning:“View Controller” is unreachable because it has no entry points

    Unsupported Configuration: “View Controller” is unreachable because it has no entry points, and no i ...

  2. T2627 村村通 codevs

    http://codevs.cn/problem/2627/  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description 农民约翰被选为他们 ...

  3. Linux终端Shell下的常用快捷键收集

    删除 [Ctrl]+[D]删除光标所在位置上的字符相当于VIM里x或者dl [Ctrl]+[H]删除光标所在位置前的字符相当于VIM里hx或者dh [Ctrl]+[K]删除光标后面所有字符相当于VIM ...

  4. 【stl学习笔记】deques

    deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似.deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map ...

  5. Android手机中UID、PID作用及区别

    PID 指进程ID. PID是进程的身份标识,程序一旦运行,就会给应用分配一个独一无二的PID(ps:一个应用可能包含多个进程,每个进程有唯一的一个PID) 进程终止后PID会被系统收回,再次打开应用 ...

  6. Xcode中使用git

    项目中添加git 也可在开始新建项目时勾选git,这是针对开始没有勾选git的情况 打开终端 cd 项目文件目录 //初始化一个代码仓库, git init //将当前目录及子目录中的文件标记为要添加 ...

  7. ios开发--NSDate与NSDateFormatter的相关用法【转】

    原文地址:http://blog.sina.com.cn/s/blog_91ff71c0010188u9.html 1.NSDateFormatter配合NSDate与NSString之间的转化  N ...

  8. [读书笔记]《没人会告诉你的PPT真相》

    这本书分了三部分.第一部分偏重于基础技能,其中分为三部分,打印.放映.保存.第二部分是进阶,分为模板下载.模板修改.增加自定义页面等.第三部分是打造商业范的PPT,分为商业范的特征,具体技能体现(重复 ...

  9. [JS进阶] HTML5 之文件操作(file)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/oscar999/article/details/37499743 前言 在 HTML 文档中 < ...

  10. Buildroot構建指南--Overview【转】

    本文转载自:http://www.unixlinux.online/unixlinux/linuxjc/gylinux/201703/65218.html Buildroot構建指南--Overvie ...