LINK:月下柠檬树

之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了.

辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算几何.

求面积的并也没有什么好的方法 不能使用半平面交 因为不是一个凸多边形.

决定使用辛普森之后 容易想到 要求出 函数f(x)的式子.

考虑 当x处于一个圆中时 容易求得f(x) 利用勾股定理即可 考虑在梯形内时 容易发现在两圆的公切线上.

求出公切线的解析式就完事了.这个问题 容易使用相似三角形等等解决。

之后需要确定 真正的范围 因为 圆可能向前或者向后覆盖.

辛普森的时候 每次求某个点的f(x)时 需要和圆或者函数取max.

然后就是常规积分了. 最难的可能是在求解析式的时候 需要仔细推.

const int MAXN=1010;
int n;
db A;//光和地面的夹角.
struct wy{db x;db r;}t[MAXN];
struct Line{db k,b,L,R;}q[MAXN];
inline db len(db a,db b)
{
return sq(a*a-b*b);
}
inline void get_tan(int x,int y)
{
if(fabs(r(x)-r(y))<=EPS)
{
q[x].L=x(x);
q[x].R=x(y);
q[x].k=0;q[x].b=r(x);
return;
}
db dx=x(y)-x(x),dr=fabs(r(x)-r(y));
//dx为两圆距离 dr 为那条边的长.
db ly,ry;
if(r(x)>r(y))
{
q[x].L=x(x)+r(x)*dr/dx;//求出cos
q[x].R=x(y)+(q[x].L-x(x))*r(y)/r(x);
ly=len(r(x),q[x].L-x(x));
ry=len(r(y),q[x].R-x(y));
q[x].k=(ry-ly)/(q[x].R-q[x].L);
q[x].b=ly-q[x].L*q[x].k;
}
else
{
q[x].R=x(y)-r(y)*dr/dx;
q[x].L=x(x)-(x(y)-q[x].R)*r(x)/r(y);
ly=len(r(x),q[x].L-x(x));
ry=len(r(y),q[x].R-x(y));
q[x].k=(ry-ly)/(q[x].R-q[x].L);
q[x].b=ly-q[x].L*q[x].k;
}
}
inline db F(db x)
{
db ans=0;
rep(1,n-1,i)if(x<x(i)+r(i)&&x>x(i)-r(i))ans=ans>len(r(i),x-x(i))?ans:len(r(i),x-x(i));
rep(1,n-1,i)if(x>=q[i].L&&x<=q[i].R)ans=ans>q[i].k*x+q[i].b?ans:q[i].k*x+q[i].b;
return ans;
}
db simpson(db a,db b)
{
db c=(a+b)/2.0;
return (b-a)*(F(a)+4*F(c)+F(b))/6.0;
}
db jf(db a,db b,db ans)
{
db c=(a+b)/2.0;
db L=simpson(a,c),R=simpson(c,b);
if(fabs(L+R-ans)<EPS)return L+R;
return jf(a,c,L)+jf(c,b,R);
}
int main()
{
//freopen("1.in","r",stdin);
gt(n);gi(A);//邻=对/tanA.
A=1/tan(A);
gi(x(1));x(1)*=A;
rep(2,n+1,i)gi(x(i)),x(i)*=A,x(i)+=x(i-1);
rep(1,n,i)gi(r(i));r(++n)=0.0;
rep(1,n-1,i)get_tan(i,i+1);
db ll=x(1)-r(1),rr=x(n);
rep(1,n,i)
{
rr=rr<x(i)+r(i)?x(i)+r(i):rr;
ll=ll>x(i)-r(i)?x(i)-r(i):ll;
}
printf("%.2lf\n",2*jf(ll,rr,simpson(ll,rr)));
return 0;
}

5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法的更多相关文章

  1. 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp

    LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 ...

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

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

  3. 洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)

    题面 传送门 题解 我还好奇自适应辛普森法干嘛用的呢--突然想起来积分的一个用处就是求曲边图形的面积-- 我们先来考虑一下这些投影是什么形状 一个圆的投影还是它自己 一个圆锥的投影是一个圆加上一个点, ...

  4. 省选模拟赛 4.26 T1 dp 线段树优化dp

    LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...

  5. 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治

    LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...

  6. 5.20 省选模拟赛 T1 图 启发式合并 线段树合并 染色计数问题

    LINK:图 在说这道题之前吐槽一下今天的日子 520 = 1+1+4+514. /cy 这道题今天做的非常失败 一点分都没拿到手 关键是今天的T3 把我整个人给搞崩了. 先考虑 如果得到了这么一张图 ...

  7. 4.9 省选模拟赛 生成树求和 变元矩阵树定理 生成函数 iDFT 插值法

    有同学在loj上找到了加强版 所以这道题是可以交的.LINK:生成树求和 加强版 对于30分 爆搜 可实际上我爆搜只过了25分 有同学使用按秩合并并茶几的及时剪枝通过了30分. const int M ...

  8. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  9. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

随机推荐

  1. 前端老司机常用的方法CSS如何清除浮动?清除浮动的几种方式

    在前端开发过程中,我们经常会使用到浮动(float),这个我们即爱又恨的属性.爱,是因为通过浮动,我们能很方便地进行布局:恨,是因为浮动之后遗留下来太多的问题需要解决.下面本篇文章给大家介绍CSS清除 ...

  2. spring cloud gateway 限流做法

    标题 随风倒十分 反对法

  3. redis源码学习之工作流程初探

    目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...

  4. Celery无法注册任务的几种情况

    Celery处理异步任务使得程序不必等待任务结束就可以继续执行其它任务或返回数据结果, 在处理耗时任务如发送邮件.发送信息验证码等场景下非常适用! Celery使用方法灵活,根据具体业务有不同的部署和 ...

  5. 前端07 /jQuery初识

    前端07 /jQuery初识 目录 前端07 /jQuery初识 1.jquery介绍 1.1 jquery的优势 1.2 jquery是什么? 1.3 jquery的导入 2.jQuery的使用 2 ...

  6. 微博大数据即席查询(OLAP)引擎实践

    前言 适用于 即席查询 场景的开源查询引擎有很多,如:Elasticsearch.Druid.Presto.ClickHouse等:每种系统各有利弊,有的擅长检索,有的擅长统计:实践证明,All In ...

  7. 00-Windows系统MySQL数据库的安装

    1.数据库安装 官网下载MySQL数据库. 下载安装包后解压缩到相关目录,我解压缩到:D:\360极速浏览器下载\mysql-8.0.19-winx64. 打开刚刚解压的文件夹 D:\360极速浏览器 ...

  8. nginx极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...

  9. SQL中的多表联查(SELECT DISTINCT 语句)

    前言:(在表中,可能会包含重复值.这并不成问题,不过,有时你也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值.) 如果不加DISTINCT 的话,主表本来 ...

  10. Kite: 一个分布式微服务框架(翻译)

    原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...