题目大意

给定一些圆和梯形,求它们面积的并

解答

直接用辛普森公式积分

∫baf(x)×dx≈b−a6[f(a)+f(a+b2)+f(b)]

\int_a^bf(x)\times dx \approx {b-a\over6}[f(a)+f({a+b\over2})+f(b)]
由于辛普森公式对于4次及以上的函数误差比较大,所以可以二分,当满足

|Simpson(a,b)−Simpson(a,a+b2)−Simpson(a+b2,b)|≤eps

|Simpson(a, b)-Simpson(a,{a+b\over2})-Simpson({a+b\over2}, b)| \le eps
时就可以近似认为Simpson求出的值是正确值。
f(x)只要预处理一下就可以出来,首先将所有的高度乘上 cot(α)cot(\alpha),然后求相邻两个不套在一起的圆的公切线:

sinA=BD−CEBCD(B.x+BD×sinA,BD×cosA)

sinA={BD-CE\over BC}\\D(B.x+BD\times sinA, BD \times cosA)

参考代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <algorithm>using namespace std;const double eps = 1e-8;class Line
{public:double x1, y1, x2, y2;
};int n;
double alpha;
double h[800];
double r[800];
double ll = 0, rr = 0;
Line ls[1600];
int lt = 0;inline double sqr(double x)
{return x*x;
}void readin()
{scanf("%d %lf", &n, &alpha);double tmp = 1/tan(alpha);double x;for (int i = 0; i <= n; i++) {scanf("%lf", &x);x *= tmp;h[i] = x + (i ? h[i-1] : 0);}for (int i = 0; i < n; i++) {scanf("%lf", &r[i]);ll = min(ll, h[i]-r[i]);rr = max(rr, h[i]+r[i]);}r[n] = 0;rr = max(rr, h[n]);
}void preWork()
{double d;for (int i = 0; i < n; i++) {d = h[i+1]-h[i];if (d > fabs(r[i+1]-r[i])) {double sinbeta = (r[i]-r[i+1])/d;double cosbeta = sqrt(1-sqr(sinbeta));ls[lt].x1 = h[i]+r[i]*sinbeta;ls[lt].y1 = r[i]*cosbeta;ls[lt].x2 = h[i+1]+r[i+1]*sinbeta;ls[lt++].y2 = r[i+1]*cosbeta;}}
}double f(double l)
{double ret = 0;for (int i = 0; i < n; i++) {if (fabs(h[i]-l) < r[i])ret = max(ret, sqrt(sqr(r[i])-sqr(h[i]-l)));}for (int i = 0; i < lt; i++) {if (ls[i].x1 < l && ls[i].x2 > l) {double k = (ls[i].y2-ls[i].y1) / (ls[i].x2-ls[i].x1);ret = max(ret, ls[i].y1+k*(l-ls[i].x1));}}return ret;
}double simpson(double lp, double rp)
{double mid = (lp+rp)/2;return (rp-lp)*(f(lp)+4*f(mid)+f(rp))/6;
}double work(double lp, double rp)
{double mid = (lp+rp)/2;double cmp = simpson(lp, mid) + simpson(mid, rp);double cmp1 = simpson(lp, rp);if (fabs(cmp1-cmp) < eps)return cmp;return work(lp, mid) + work(mid, rp);
}int main()
{readin();preWork();printf("%.2lf", work(ll, rr)*2);return 0;
}

BZOJ 1502 NOI 2005 月下柠檬树相关推荐

  1. BZOJ 1502:月下柠檬树

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

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

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

  3. 【bzoj 1502】月下柠檬树

    月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...

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

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

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

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

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

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

  7. 【NOI2005】 月下柠檬树

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

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

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

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

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

最新文章

  1. Platform Builder 5下WinCE 5.0目录结构
  2. JAVA基础中关于double进制问题的解析
  3. mysql补充(3)优化sql语句查询常用的30种方法
  4. mysql1526错误_mysql 分区 1526错误
  5. 【剑指offer】_18 数据流中的中位数
  6. 第38天:运算符、字符串对象常用方法
  7. python测试框架untest_Python测试框架之unittest和pytest
  8. linux之软连接和硬连接的区别
  9. Android模拟器中添加SD卡(转)
  10. MySQL备份---lvm snapshot
  11. 计算机知识提炼,2017计算机考研:操作系统复习策略及重要知识点提炼
  12. linux安装Drcom客户端,Ubuntu 10.10校园网安装宽带认证客户端Drcom联网
  13. Arduino学习之第一篇
  14. spring boot 2.0 配置logback日志
  15. 华为任正非《一江春水向东流》读后感
  16. 读文献——《Deep Residual Learning for Image Recognition》
  17. Java MediaMetadataCompat
  18. vue+element实现美观大方好看的音乐网站,仿照咪咕音乐网
  19. mountain乐谱-蒲公英的约定
  20. UE4/5 EasyFog插件使用

热门文章

  1. 从“交易核心”到“数据核心”,国产数据库要换道超车丨数据猿专访
  2. yield函数c语言,yield的用法
  3. C++系列案例-大数据减法-绘制余弦曲线-兔子数量-快速排序
  4. java计算机毕业设计线上甜品店售卖系统源码+系统+数据库+lw文档
  5. 【电子技术】眼图的基本概念和原理(2)
  6. HashMap的put()方法的再理解
  7. 在PHP中implement什么意思,php 接口,extends,implement,implements 作用及区别收集整理
  8. 王权富贵:给Linux系统装配机器学习需要的软件
  9. 暴强贴:从.NET平台调用Win32 API
  10. 查询学生表中姓“张”,“李”,“刘”的学生的情况。