题面

传送门

题解

我还好奇自适应辛普森法干嘛用的呢……突然想起来积分的一个用处就是求曲边图形的面积……

我们先来考虑一下这些投影是什么形状

一个圆的投影还是它自己

一个圆锥的投影是一个圆加上一个点,以及这个点和圆的两条切线(如果点在圆内部就没有这两条切线)

一个圆台的投影是两个圆加上它们的公切线

最后这个鬼畜的图形大概是长这个样子

暴力求解即可

我们可以看做这是一个鬼畜的函数,我们要求它在这一段上的积分,那么就是这个封闭图形的面积了,自适应辛普森法即可

//minamoto
#include<bits/stdc++.h>
#define R register
#define sqr(x) ((x)*(x))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1005;const double eps=1e-6;
struct node{double x,y;node(){}node(R double xx,R double yy):x(xx),y(yy){}}p;
struct cir{double x,r;cir(){}cir(R double xx,R double rr):x(xx),r(rr){}}C[N];
struct line{node s,t;double k,b;line(){}line(R node ss,R node tt):s(ss),t(tt){k=(t.y-s.y)/(t.x-s.x),b=t.y-t.x*k;}inline double f(R double x){return k*x+b;}
}L[N];
int n,tot;double h[N],ll=1e9,rr,ta,alp,x,r,a,b;
void add(const R cir &s,const R cir &t){R double si=(s.r-t.r)/(t.x-s.x),co=sqrt(1-sqr(si)),ta=si/co;++tot;L[tot].s=node(s.x+s.r*si,s.r*co),L[tot].t=node(t.x+t.r*si,t.r*co),L[tot].k=-ta,L[tot].b=L[tot].t.y-L[tot].t.x*L[tot].k;
}
double F(R double x){R double res=0;fp(i,1,tot)(x>=L[i].s.x&&x<=L[i].t.x)?cmax(res,L[i].f(x)):0;fp(i,1,n)(x>=C[i].x-C[i].r&&x<=C[i].x+C[i].r)?cmax(res,sqrt(sqr(C[i].r)-sqr(x-C[i].x))):0;return res;
}
double simpson(R double l,R double r){return (F(l)+F(r)+4*F((l+r)/2))*(r-l)/6;}
double calc(double l,double r,double eps,double res){double mid=(l+r)/2,ql=simpson(l,mid),qr=simpson(mid,r);if(fabs(ql+qr-res)<=15*eps)return ql+qr+(ql+qr-res)/15;return calc(l,mid,eps/2,ql)+calc(mid,r,eps/2,qr);
}
int main(){
//  freopen("testdata.in","r",stdin);scanf("%d%lf",&n,&alp),ta=tan(alp);fp(i,1,n+1)scanf("%lf",&h[i]),h[i]+=h[i-1];fp(i,1,n)scanf("%lf",&C[i].r),C[i].x=h[i]/ta;p=node(h[n+1]/ta,0),x=C[n].x,r=C[n].r;cmax(rr,p.x),cmax(rr,x+r),cmin(ll,x-r);if(p.x>x+r)a=sqr(r)/(p.x-x),b=sqrt(sqr(r)-sqr(a)),L[++tot]=line(node(x+a,b),p);fd(i,n-1,1){cmax(rr,C[i].x+C[i].r),cmin(ll,C[i].x-C[i].r);if(C[i+1].x-C[i].x>fabs(C[i+1].r-C[i].r))add(C[i],C[i+1]);}printf("%.2lf\n",2*calc(ll,rr,eps,simpson(ll,rr)));return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10528174.html

洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)相关推荐

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

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

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

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

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

    题目 原题链接:点这里 总体思路–>问题转化 先将原本的柠檬树分解成为多个圆台,再单独看圆台的投影 一个圆在地面的投影,是等比例的,而一条竖线的投影长度d=htan⁡αd=\cfrac{h}{\ ...

  4. [NOI2005]月下柠檬树 (自适应辛普森)

    P4207 [NOI2005]月下柠檬树 如图,我们要求的面积就是这些圆形跟梯形的组合,由于投射到地面上,显然有h′=htanθh' = \frac{h}{tan \theta}h′=tanθh​,由 ...

  5. 1502: [NOI2005]月下柠檬树

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1077  Solved: 600 [Submit][Statu ...

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

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

  7. BZOJ 1502: [NOI2005]月下柠檬树 simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1244  Solved: 662 [Submit][Statu ...

  8. 1502: [NOI2005]月下柠檬树 - BZOJ

    Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,-,hn,表示树离地的 ...

  9. BZOJ 1502 NOI2005 月下柠檬树 Simpson自适应公式

    题目大意:给定一棵由圆台和圆锥构成的柠檬树,月光以α的夹角平行射向地面,求阴影部分面积 补充题目大意:看到这题我产生了心理阴影,求阴影部分面积 题目不好分析,但其实就是求一堆圆和一堆梯形的面积交 样例 ...

  10. [BZOJ1502] [NOI2005]月下柠檬树

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

最新文章

  1. Visual Basic 永远29岁,Visual Basic 谢幕!
  2. 产品经理的成长历程(宏观)
  3. ckeditor的使用实例
  4. 单点登陆框架CAS的研究
  5. eclipse从入门到精通_JAVA成长之路入门学习路线
  6. 网络对抗技术作业一 201421410031
  7. printf函数的格式修饰符
  8. Java Date hashCode()方法与示例
  9. Centos6.5 恢复误删的系统面板
  10. 想要玩转Mac?试试这几款神器吧!
  11. 将adb命令打包成脚本
  12. 通用版工业制程SPC管理系统,源代码分享
  13. javaparser - java源码分析修改框架
  14. 快播(Qvod)也开始耍流氓了
  15. 基于(7,4 ) 线性分组码编码和 BPSK 调制
  16. stm32单片机驱动L298N模块
  17. 500行代码,教你用python写个微信飞机大战
  18. C++的数据复合类型
  19. Python学习资源
  20. [go学习笔记.第二章] 2.go语言的开发工具以及安装和配置SDK

热门文章

  1. workman 日志_Workman手册笔记一
  2. android按钮悬停吸附,Android简单实现悬浮吸附的FloatingView
  3. php画图取色,图片取色,涂抹代码,Python交流,技术交流区,鱼C论坛 - Powered by Discuz!...
  4. ObjectARX 2016 安装心得
  5. 功能测试 —— TPShop商城项目
  6. 无限制翻译PDF文件——低调使用
  7. 最大面额钞票10的21次方
  8. Java基础篇--概念理解(泛型、注解)
  9. Java基础篇--集合(collection)
  10. 蓝桥杯C语言算法提高:复数归一化