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. nth-child,nth-last-child,after,before,tab-highlight-color,first-child,last-child

    nth-child:定义第几个元素或者是奇数或者是偶数,或者满足某个数字倍数的dom的样式 如 li:nth-child(3n),结果如下,li:nth-child(2)结果如下

  2. thinkphp将对象变成一维数组?

    thinkphp使用select查询出的数据为二维数组,如果想将二维数组转一维,可以使用: $x为二维数组对象 php版本要大于5.5.0 $userid_array = array_column($ ...

  3. appium升级操作

    在app自动化测试中经常会碰到,因为appium版本低而导致,appium客户端连接不到appium服务端等一系列错误~ 其实appium升级很简单的哦~ 打开cmd命令行终端,键入npm updat ...

  4. 仅需5步,轻松升级K3s集群!

    Rancher 2.4是Rancher目前最新的版本,在这一版本中你可以通过Rancher UI对K3s集群进行升级管理. K3s是一个轻量级Kubernetes发行版,借助它你可以几分钟之内设置你的 ...

  5. Django框架03 /视图相关

    Django框架03 /视图相关 目录 Django框架03 /视图相关 1. 请求相关 2.响应相关 3.FBV和CBV 视图(视图函数和视图类) 3.1 类视图 CBV 3.2 视图函数 FBV ...

  6. ValueError: X needs to contain only non-negative integers.

    for feature in short_cate_feature: enc.fit(data[feature].values.reshape(-1, 1)) base_train_csr = spa ...

  7. unity-热更-InjectFix(一)

    1 C#热更新预备知识 1.1 mono.cecil注入 使用Mono.Cecil实现IL代码注入 注入之后修改dll,新增mdb文件: 注意,待了解参数注释打开会报错: 1.2 InjectFix ...

  8. 用Vue实现一个简单的图片轮播

    本文已收录至https://github.com/likekk/studyBlog欢迎大家star,共同学习,共同进步.如果文章有错误的地方,欢迎大家指出.后期将在将GitHub上规划前端学习的路线和 ...

  9. 详解 CmProcess 跨进程通信的实现

    CmProcess 是 Android 一个跨进程通信框架,整体代码比较简单,总共 20 多个类,能够很好的便于我们去了解跨进程实现的原理. 个人猜测 CmProcess 也是借鉴了 VirtualA ...

  10. CF940E Cashback 线段树优化DP

    题目描述 Since you are the best Wraith King, Nizhniy Magazin «Mir» at the centre of Vinnytsia is offerin ...