P4207 [NOI2005]月下柠檬树

如图,我们要求的面积就是这些圆形跟梯形的组合,由于投射到地面上,显然有h′=htanθh' = \frac{h}{tan \theta}h′=tanθh​,由此我们就可以开始推导这个f(x)f(x)f(x)函数了。

所以转换为我们要推导出直线a,ba, ba,b的函数表达式了。

有公切线ababab,矩形abgcabgcabgc,所以显然有eg=rc−reeg = r_c - r_eeg=rc​−re​,由三角形acd∼ceg∼befacd \sim ceg \sim befacd∼ceg∼bef,由此我们可以得到cd,efcd, efcd,ef从而得到ad,bfad, bfad,bf,知道这里对圆公切线问题就已经解决了。

所以接下来我们知道带到函数中利用自适应辛普森求解即可,详细细节见代码描述。

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;
const double eps = 1e-6;const int N = 510;int n;double angle;struct Point {double x, y;
}circle[N], line[N << 1];void get_point() {//求得切线的左右两个坐标。for(int i = 1; i < n; i++) {double x1 = circle[i].x, x2 = circle[i + 1].x, r1 = circle[i].y, r2 = circle[i + 1].y;double ce = r1 * (r1 - r2) / (x2 - x1), xa = x1 + ce, ya = sqrt(r1 * r1 - ce * ce);double gd = r2 * (r1 - r2) / (x2 - x1), xb = x2 + gd, yb = sqrt(r2 * r2 - gd * gd);line[2 * i - 1] = {xa, ya}, line[2 * i] = {xb, yb};}
}double f(double x) {double ans = 0.0;for(int i = 1; i <= n; i++) {//在圆里面,if(x < circle[i].x + circle[i].y && x > circle[i].x - circle[i].y) {ans = max(ans, sqrt(circle[i].y * circle[i].y - (x - circle[i].x) * (x - circle[i].x)));}}for(int i = 1; i <= 2 * (n - 1); i += 2) {//被切线包围,if (x >= line[i].x && x <= line[i + 1].x) {ans = max(ans, (line[i + 1].y - line[i].y) / (line[i + 1].x - line[i].x) * (x - line[i].x) + line[i].y);}}//这些值一定是取最大嘛,因为它可能同时符合圆,切线的要求,所以我们得取覆盖面积最大的。return ans;
}double sim(double l, double r) {return (r - l) * (f(l) + f(r) + f((l + r) / 2.0) * 4.0) / 6.0;
}double asr(double l, double r, double eps, double ans) {double mid = (l + r) / 2.0;double ansl = sim(l, mid), ansr = sim(mid, r);if(fabs(ansl + ansr - ans) < 15.0 * eps) return ansl + ansr + (ansl + ansr - ans) / 15.0;return asr(l, mid, eps / 2.0, ansl) + asr(mid, r, eps / 2.0, ansr);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %lf", &n, &angle);angle = tan(angle);n++;for(int i = 1; i <= n; i++) {   scanf("%lf", &circle[i].x);circle[i].x /= angle;//改变x的值,求个前缀和得到对应的准确的坐标。circle[i].x += circle[i - 1].x;}for(int i = 1; i < n; i++) {scanf("%lf", &circle[i].y);}circle[n].y = 0;get_point();double l = circle[1].x - circle[1].y, r = circle[n].x;//确定积分区间。for(int i = 1; i <= n; i++) {l = min(l, circle[i].x - circle[i].y);r = max(r, circle[i].x + circle[i].y);}printf("%.2f", 2.0 * asr(l, r, eps, sim(l, r)));return 0;
}

[NOI2005]月下柠檬树 (自适应辛普森)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 4大主流CPU处理器技术架构,不知道就out了!
  2. sql group by 取每组符合条件_从零学SQL-经典面试题
  3. 51nod 1179 最大的最大公约数 (打表计数法)
  4. 全局变量中断原子操作_中断函数里改变一个全局变量的值,在主函数里却检测到未变化...
  5. 安卓 简单的登录案例
  6. H264 视频文件 帧格式 传输封装等 杂碎
  7. 1001 A+B Format (20 分)
  8. lsm tree java_BasicTreeUI
  9. 深度学习含有递进关系的数据应该如何表达_文案写作:如何构建写作框架优化表达内容?...
  10. 数字信号处理(matlab)——FFT对信号频谱分析
  11. HIT 软件构造 软件维护 设计原则
  12. 电脑自带的edge浏览器无法访问解决问题
  13. Word 中章节标题前的方形黑点消失与显示
  14. Java中的其他常用类(Math类,Scanner类、正则表达式)
  15. 丽博版魔都家居图鉴:如何住进《三十而已》的精致家
  16. office 2010 安装出错
  17. 【树莓派】基于树莓派,实现无线路由功能
  18. Facebook MySQL工程师吐槽MemSQL:MySQL比你们快无数倍
  19. 解决editplus编译出现中文乱码
  20. 互联网大厂造AI芯片,前景如何?

热门文章

  1. InfoGAN论文笔记+源码解析
  2. 【Qt作业】利用帧动画实现运动的小人
  3. 为什么我从Flutter转投Electron的怀抱?
  4. 如何才能学好java框架
  5. 网易Java开发岗面试分享
  6. 工作之外如何实现自我提升
  7. K8S之ipvs负载均衡原理
  8. 【前端框架学习】第一次实验 跑马灯效果的制作
  9. 机器学习算法(4)—— 决策树算法
  10. 鄂马赛记 | 跑步就跑步,跑什么马拉松?