Portal

  
  传送门
  
  
  

Solution

  
  显然的是,每一个圆的影子,就是从树上的圆按光线方向平移至地面的圆。至于两个圆之间的连接部分,则是每两个在树上相邻的圆的,对应的影子圆的,公切线围起来的部分,如下图所示
  

  
  所以我们现在要求每两个在原树上相邻的圆的影子圆构成的图形的并。只看\(x\)轴上半部分,可以把它想象成一个函数,求单点值是\(O(n)\)的,我们不妨用辛普森积分来解决......
  
  相邻圆的公切线和x轴的夹角是可以求出来的,然后就能解出公切线的解析式,以及有效范围。注意这些东西要预处理!千万不要放在求值函数里面。\(EPS\)大约设置到\(10^{-7}\)才不会出错,效率也相对比较高。
  
  
  

Code

  

#include <cstdio>
#include <cmath>
using namespace std;
const int N=505;
const double EPS=1e-7,INF=1e10,PI=3.14159265358979323846;
int n,sum;
double alpha,h[N],p[N],r[N];
double k[N],b[N],lx[N],rx[N];
bool exist[N];
inline double max(double x,double y){return x>y?x:y;}
inline double min(double x,double y){return x<y?x:y;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
inline bool in(int a,int b){if(r[a]>r[b]) swap(a,b);return p[a]+r[a]-EPS<=p[b]+r[b]&&p[a]-r[a]+EPS>=p[b]-r[b];
}
double calc(int a,int b,double &k,double &bb,double &xl,double &xr){if(p[a]>p[b]) swap(a,b);double beta=asin((r[b]-r[a])/(p[b]-p[a]));k=tan(beta);double tx;if(r[a]>=r[b]){beta=-beta;tx=p[b]+r[b]/sin(beta); bb=-k*tx;   xr=tx-(cos(beta)*(r[b]/tan(beta)));xl=tx-(cos(beta)*(r[a]/tan(beta)));}else{tx=p[a]-r[a]/sin(beta);bb=-k*tx;xl=tx+(cos(beta)*(r[a]/tan(beta)));xr=tx+(cos(beta)*(r[b]/tan(beta)));}
}
double f(double x){double res=0;for(int i=1;i<=n;i++) if(fabs(x-p[i])<=r[i]) res=max(res,sqrt(r[i]*r[i]-fabs(x-p[i])*fabs(x-p[i])));for(int i=1;i<n;i++)if(exist[i])if(lx[i]<=x+EPS&&x-EPS<=rx[i])res=max(res,k[i]*x+b[i]);return res;
}
double simpson(double l,double r){double mid=(l+r)*0.5;return (f(l)+4*f(mid)+f(r))*(r-l)/6;
}
double solve(double l,double r){double mid=(l+r)/2,lmid=(l+mid)/2,rmid=(mid+r)/2;double val=simpson(l,r);if(fabs(val-(simpson(l,mid)+simpson(mid,r)))<EPS) return val;return solve(l,mid)+solve(mid,r);
}
int main(){scanf("%d%lf",&n,&alpha);n++;for(int i=1;i<=n;i++){scanf("%lf",h+i);h[i]+=h[i-1];p[i]=h[i]/tan(alpha);}for(int i=1;i<n;i++) scanf("%lf",r+i);double xl=INF,xr=-INF;for(int i=1;i<=n;i++){xl=min(xl,p[i]-r[i]);xr=max(xr,p[i]+r[i]);}for(int i=1;i<n;i++){exist[i]=!in(i,i+1);if(exist[i])calc(i,i+1,k[i],b[i],lx[i],rx[i]);}printf("%.2lf\n",solve(xl,xr)*2);return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9219980.html

【BZOJ1502】【NOI2005】月下柠檬树相关推荐

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

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

  2. bzoj1502: [NOI2005]月下柠檬树

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

  3. [BZOJ1502][NOI2005]月下柠檬树(辛普森积分+解析几何)

    题目: 我是超链接 题解: 首先我们理解一下投影的性质,也就是投影出来的图形一定跟原图形全等. 考虑一下圆形投影下来是什么呢?和原来一样的圆形啊 怎么转化竖着的树呢? 也就是树高*cot(α) 那么我 ...

  4. [BZOJ1502][NOI2005]月下柠檬树(辛普森积分)

    === === 这里放传送门 === === 题解 据说这题正解好像是各种分类讨论一块块求面积? 然而一开始知道这题辛普森积分就可以过但是差一点还是写成了那种分类讨论的方法..就一开始非常无脑求了公切 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 微软云Azure创建一个web app
  2. 序列化和反序列化uint64_t数据
  3. CentOS 6.3 64bit 搭建vsFTP服务
  4. 今晚直播 | AAAI 2022论文解读:重新思考图像融合策略和自监督对比学习
  5. 《VMware vSphere设计(原书第2版)》——1.1 什么是设计
  6. 各种UNIX系统下root密码的修复
  7. Java Script学习 6(转)
  8. 转 oracle 监控执行计划突然变化
  9. 写刀路的一些经验[分享] 铜公加工方法及注意事项
  10. 程序员编程艺术第四十一章 四十二章 荷兰国旗 矩阵相乘Strassen算法
  11. web前端期末大作业—— HTML+CSS豪华车 (9页)
  12. 数据库实验系列之1数据库及数据库中表等数据库对象的建立实验(包括关系图、完整性、权限控制、视图、索引等内容)
  13. Scala的安装与配置
  14. php代码优化思路,PHP优化思路 Web程序 - 贪吃蛇学院-专业IT技术平台
  15. flutter/dart通过ffi调用rust代码
  16. Roadblocks(次短路)
  17. 【Linux】ifconfig不显示ip地址
  18. mysql之DDL操作
  19. python常用的数字类型方法_python基础--数据类型的常用方法1
  20. 单片机蓝牙模块的使用,以及配置控制舵机的源码

热门文章

  1. 【已解决】qlv格式转mp4(腾讯视频)
  2. Ubuntu的shell脚本踩keng-unexpected operator
  3. 村长选举c语言程序,菜鸡学C语言之摸鱼村村长
  4. 原创 | 罗勇:立足敏捷开放,推动直销银行向智能银行迈进
  5. 自制 计算机主板,三步教你如何DIY电脑主板和CPU的搭配
  6. 麦客服务器维修,麦客
  7. (兼职月赚两万?)程序员如何接私活? 如何让自己的知识变现?
  8. 关于异业联盟和O2O商业模式的一些想法
  9. flutter网络请求基础知识铺垫、及实战举例
  10. 【python】详解pandas库的pd.merge_ordered与pd.merge_asof