月下柠檬树

题意

求n个圆与他们的公切线的定积分。

解法

求出圆的公切线就可以了。
特别坑的一点
最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端。
比较坑的一点
精度要设小一点,不然会TLE。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{x=0;T k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=(500+5)*2;
struct cir{double x,r;double h(double k){double d=fabs(k-x);return sqrt(r*r - d*d);}
}c[maxn];
struct lin{// y=kx+bdouble k,b,lx,ly;double h(double x){return x*k+b;}
}p[maxn];
int n;
double F(double x){double ans=0.0;for(int i=1;i<=n;i++){if(x>(c[i].x-c[i].r)&&x<(c[i].x+c[i].r))ans=max(ans,c[i].h(x));}for(int i=1;i<n;i++){if(x>=p[i].lx&&x<=p[i].ly)ans=max(ans,p[i].h(x));}return ans;
}
double simpson(double a,double b){double mid=(a+b)/2;//*0.5???return ( F(a) + 4*F(mid) + F(b) ) * (b-a)/6;
}
double asr(double a,double b,double eps,double A){double mid = (a+b)/2;double L = simpson(a,mid) , R = simpson(mid,b);if(fabs(L+R-A) <= 15*eps) return L+R+(L+R-A)/15;return asr(a,mid,eps/2,L) + asr(mid,b,eps/2,R);
}
double asr(double l,double r,double eps){return asr(l,r,eps,simpson(l,r));
}
double alpha;
double h[maxn];
int main()
{scanf("%d%lf",&n,&alpha);n++;alpha= 1.0 / tan(alpha);for(int i=1;i<=n;i++) scanf("%lf",&h[i]);for(int i=1;i<n;i++) scanf("%lf",&c[i].r);c[n].r=0.0;for(int i=1;i<=n;i++) c[i].x=c[i-1].x+h[i];for(int i=1;i<=n;i++) c[i].x*=alpha;for(int i=1;i<n;i++){if((c[i+1].x+c[i+1].r)<=(c[i].x+c[i].r)) continue;if(fabs(c[i].r-c[i+1].r)<=1e-6){p[i].lx=c[i].x,p[i].ly=c[i+1].x;p[i].k=0.0;p[i].b=c[i].r;continue;}if(c[i].r<c[i+1].r){double _cos=(c[i+1].r-c[i].r)/(c[i+1].x-c[i].x);double d=_cos*c[i+1].r;double y2 = sqrt(c[i+1].r*c[i+1].r - d*d);p[i].ly=c[i+1].x-d;d=_cos*c[i].r;double y1 = sqrt(c[i].r*c[i].r - d*d);p[i].lx=c[i].x-d;p[i].k = (y1-y2)/(p[i].lx-p[i].ly);p[i].b = y1 - p[i].k*p[i].lx;}else{double _cos=(c[i].r-c[i+1].r)/(c[i+1].x-c[i].x);double d=_cos*c[i].r;p[i].lx=c[i].x+d;double y1 = sqrt(c[i].r*c[i].r - d*d);d=_cos*c[i+1].r;double y2 = sqrt(c[i+1].r*c[i+1].r - d*d);p[i].ly=c[i+1].x+d;p[i].k = (y1-y2)/(p[i].lx-p[i].ly);p[i].b = y1 - p[i].k*p[i].lx;}}//*****double ll=c[1].x-c[1].r,rr=c[n].x;for(int i=1;i<=n;i++){double l=c[i].x-c[i].r,r=c[i].x+c[i].r;ll=min(l,ll);rr=max(rr,r);}printf("%.2lf",2*asr(ll,rr,1e-6));return 0;
}

转载于:https://www.cnblogs.com/mrasd/p/9516736.html

【bzoj 1502】月下柠檬树相关推荐

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

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

  2. bzoj 1502月下柠檬树 Simpson积分

    关键点是,水平的圆投影到水平面之后仍然是与原先全等的圆. 然后圆与圆之间通过曲面无缝连接,所以投影下来之后圆与圆之间通过公切线连接. 直接求有点难.把投影区域的上边界当成一个函数,然后套Simpson ...

  3. HYSBZ - 1502 月下柠檬树【辛普森积分】

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

  4. BZOJ 1502:月下柠檬树

    BZOJ 1502:月下柠檬树 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题目大意:给出一棵由圆台构成的树以及一个平行光源,问 ...

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

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

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

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

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

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

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

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

  9. 【NOI2005】 月下柠檬树

    题目描述 月下柠檬树 主文件名:lemon [问题描述] 李哲非常非常喜欢柠檬树, 特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时, 他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 ...

最新文章

  1. asp提供在线文章翻译的功能(转)
  2. 斯洛文尼亚接受BCH支付的商家达343家,日本和北昆士兰州对BCH接受度增长迅速
  3. 如何将OutputStream转换为InputStream?
  4. Coil - Google推荐的协程图片加载库
  5. 实时获取滚动条的高度_适用于星上快速处理的雷达高度计有效波高反演技术
  6. 【LeetCode笔记】剑指 Offer 26-. 树的子结构 (Java、双重dfs、二刷)
  7. AI大有可为:NAIE平台助力垃圾分类
  8. spark学习-34-Spark的BroadcastManager广播管理器
  9. linux patch
  10. 拍照识别身份证 Android/iOS身份证识别技术
  11. windows 安全删除硬件并弹出媒体 选项灰色、无法弹出
  12. 如何在工作中设定和使用 SMART 目标
  13. Android8内测申请,微信8.0.6 for android内测版上线,附内测体验入口
  14. Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面
  15. 【运筹学】对偶理论 : 影子价格 ( 对偶问题的经济解释 )
  16. bat批处理文件搞定所有系统问题
  17. python实现选择题自动答题_答题辅助python代码实现
  18. [LINUX]解决Linux下ubuntu 20.04暂时不能解析域名“cn.archive.ubuntu.com”问题
  19. 高数 | 多元函数求极限 使用极坐标代换的条件与细节
  20. 网站的配色应该如何做

热门文章

  1. 全面超越 Appium,使用 Airtest 超快速开发 App 爬虫
  2. mes系统服务器连接失败,MES管理系统失败的三种主要原因
  3. IntelliJ IDEA 神级超级牛逼插件推荐(自用,真的超级牛逼!)
  4. 路由器与交换机技术相关配置命令
  5. k8s自定义controller,创建CRD并验证
  6. yield函数c语言,yield的用法
  7. 20个经典CSS代码集合
  8. Day1 - 原生JavaScript实现打击鼓
  9. Git push 失败:Empty reply from server 解决方法
  10. 我们应该怎样使用开源软件