题面

传送门

题解

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

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

一个圆的投影还是它自己

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

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

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

暴力求解即可

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

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define sqr(x) ((x)*(x))
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  9. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  10. using namespace std;
  11. const int N=1005;const double eps=1e-6;
  12. struct node{double x,y;node(){}node(R double xx,R double yy):x(xx),y(yy){}}p;
  13. struct cir{double x,r;cir(){}cir(R double xx,R double rr):x(xx),r(rr){}}C[N];
  14. struct line{
  15. node s,t;double k,b;
  16. line(){}
  17. 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;}
  18. inline double f(R double x){return k*x+b;}
  19. }L[N];
  20. int n,tot;double h[N],ll=1e9,rr,ta,alp,x,r,a,b;
  21. void add(const R cir &s,const R cir &t){
  22. R double si=(s.r-t.r)/(t.x-s.x),co=sqrt(1-sqr(si)),ta=si/co;
  23. ++tot;
  24. L[tot].s=node(s.x+s.r*si,s.r*co),L[tot].t=node(t.x+t.r*si,t.r*co),
  25. L[tot].k=-ta,L[tot].b=L[tot].t.y-L[tot].t.x*L[tot].k;
  26. }
  27. double F(R double x){
  28. R double res=0;
  29. fp(i,1,tot)(x>=L[i].s.x&&x<=L[i].t.x)?cmax(res,L[i].f(x)):0;
  30. 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;
  31. return res;
  32. }
  33. double simpson(R double l,R double r){return (F(l)+F(r)+4*F((l+r)/2))*(r-l)/6;}
  34. double calc(double l,double r,double eps,double res){
  35. double mid=(l+r)/2,ql=simpson(l,mid),qr=simpson(mid,r);
  36. if(fabs(ql+qr-res)<=15*eps)return ql+qr+(ql+qr-res)/15;
  37. return calc(l,mid,eps/2,ql)+calc(mid,r,eps/2,qr);
  38. }
  39. int main(){
  40. // freopen("testdata.in","r",stdin);
  41. scanf("%d%lf",&n,&alp),ta=tan(alp);
  42. fp(i,1,n+1)scanf("%lf",&h[i]),h[i]+=h[i-1];
  43. fp(i,1,n)scanf("%lf",&C[i].r),C[i].x=h[i]/ta;
  44. p=node(h[n+1]/ta,0),x=C[n].x,r=C[n].r;
  45. cmax(rr,p.x),cmax(rr,x+r),cmin(ll,x-r);
  46. 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);
  47. fd(i,n-1,1){
  48. cmax(rr,C[i].x+C[i].r),cmin(ll,C[i].x-C[i].r);
  49. if(C[i+1].x-C[i].x>fabs(C[i+1].r-C[i].r))add(C[i],C[i+1]);
  50. }
  51. printf("%.2lf\n",2*calc(ll,rr,eps,simpson(ll,rr)));
  52. return 0;
  53. }

洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)的更多相关文章

  1. [NOI2005]月下柠檬树[计算几何(simpson)]

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

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

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

  3. 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法

    LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...

  4. [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法

    关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...

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

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

  6. 【洛谷】P4207 [NOI2005]月下柠檬树

    题解 原来自适应simpson积分是个很简单的东西! 我们尝试分析一下影子,圆的投影还是圆,圆锥的尖投影成一个点,而圆台的棱是圆的公切线,我们把圆心投影出来,发现平面上圆心的距离是两两高度差/tan( ...

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

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

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

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

  9. [NOI2005]月下柠檬树

    题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Logout 捐赠本站 Probl ...

随机推荐

  1. Flask之测试与部署

    5.1 蓝图Blueprint 为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题 ...

  2. leetcode812

    class Solution { public: double largestTriangleArea(vector<vector<int>>& points) { d ...

  3. Tensorflow Mask-RCNN训练识别箱子的模型运行结果(练习)

    Tensorflow Mask-RCNN训练识别箱子的模型

  4. java 从jsp页面传集合给controller

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  5. Linux设置串口波特率等参数

    转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stt ...

  6. Solidity oraclize 常用数据源

    1. 股票数据: https://blog.quandl.com/api-for-stock-data iextrading.com www.nowapi.com 中文 2. 外汇数据: https: ...

  7. 登录xdebug

    1.配置 2.先不打断点,调至登录页面 3.在登录必经过处打断点,访问页面输入账号密码点击登录,进入代码追踪模式

  8. OVS的初始配置

    1.去掉bridge模块,为下面用OVS的模块奠定基础 rmmod bridge .insmod datapath/linux/openvswitch_mod.ko .insmod datapath/ ...

  9. RPLiDAR 激光雷达探测地面高程

    LiDAR,又称激光探测与测量,全程Light Detection And Ranging,这种技术使用激光测量地物(如森林和建筑物)的高程.它的原理十分类似于使用声波来测绘海底地形的声呐技术,或使用 ...

  10. MySQL性能调优与架构设计——第3章 MySQL存储引擎简介

    第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...