[日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法
关于自适应Simpson法的介绍可以去看我的另一篇blog
http://www.lydsy.com/JudgeOnline/problem.php?id=1502
题意:空间里圆心在同一直线上且底面与地面平行的若干个圆台和顶层的圆锥以$\alpha$的角度投影到地面,求投影的面积。
(其实我是看po姐博客来的x)
首先把圆锥的顶点也看成一个半径为0的圆锥,对于每个高度为$h$的圆投影下去的坐标是$h/tan(\alpha)$,半径不变,而对于圆台的侧面投影下去是上下底两个圆的切线。
关于两个圆的切线可以像图上这样求(参考po姐博客的x)
$\sin(\alpha)=\frac{r_{i-1}-r_i}{x_i-x_{i-1}}$
这个式子同样可以适用于其他情况,然后三角函数搞一下求出其他点的坐标,根据坐标的范围用Simpson法来求面积。
只是把求点的函数值改成扫一遍所有的点和圆,找最大值。
哦然后我的Simpson递归的时候本来是让eps乘上$\frac{1}{2}$的…但是这样会T掉,不乘又会wa…orz
然后改成$\frac{2}{3}$就可以了…跑900+ms真神奇
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=515;
struct point
{
double x,y;
};
struct line
{
point p1,p2;
double k,b;
line(){}
void modify(double x1,double y1,double x2,double y2)
{
p1.x=x1;p1.y=y1;
p2.x=x2;p2.y=y2;
k=(p1.y-p2.y)/(p1.x-p2.x);
b=p1.y-k*p1.x;
}
double f(double x)
{
return k*x+b;
}
}ls[N];
struct circle
{
double x,r;
}cs[N];
int n,tot;double alpha;
inline double f(double x)
{
double res=0;double eps=1e-6;
for(register int i=1;i<=n;i++)
{
double dis=fabs(x-cs[i].x);
if(dis-cs[i].r>-eps)continue;
double y=sqrt(cs[i].r*cs[i].r-dis*dis);
res=max(res,y);
}
for(register int i=1;i<=tot;i++)
{
if(!(ls[i].p1.x<=x&&x<=ls[i].p2.x))continue;
double y=ls[i].f(x);
res=max(res,y);
}
return res;
}
inline double calc(double l,double r)
{
double mid=l+(r-l)/2;
return (f(l)+4.0*f(mid)+f(r))*(r-l)/6.0;
}
inline double asr(double l,double r,double area,double eps)
{
double mid=l+(r-l)/2;
double L=calc(l,mid),R=calc(mid,r);
if(fabs(L+R-area)<=eps*10.0)return L+R+(L+R-area)/10.0;
return asr(l,mid,L,eps*2.0/3.0)+asr(mid,r,R,eps*2.0/3.0);
}
inline double solve(double l,double r,double eps)
{
return asr(l,r,calc(l,r),eps);
}
int main()
{
//freopen("input.in","r",stdin);
double eps=1e-6,l,r;l=r=0;
scanf("%d%lf",&n,&alpha);alpha=1/(tan(alpha));
for(register int i=1;i<=n+1;i++)
{
scanf("%lf",&cs[i].x);
cs[i].x*=alpha;
cs[i].x+=cs[i-1].x;
}
for(register int i=1;i<=n;i++)
{
scanf("%lf",&cs[i].r);
}
for(register int i=1;i<=n+1;i++)
{
l=min(l,cs[i].x-cs[i].r);
r=max(r,cs[i].x+cs[i].r);
}
for(register int i=2;i<=n+1;i++)
{
double L=cs[i].x-cs[i-1].x;
if(L-fabs(cs[i].r-cs[i-1].r)<eps)continue;
//double sin_alpha=fabs(cs[i].r-cs[i-1].r)/L;
double sin_alpha=(cs[i-1].r-cs[i].r)/L;
double cos_alpha=sqrt(1-sin_alpha*sin_alpha);
ls[++tot].modify(cs[i-1].x+cs[i-1].r*sin_alpha,cs[i-1].r*cos_alpha,
cs[i].x+cs[i].r*sin_alpha,cs[i].r*cos_alpha);
}
printf("%.2lf",solve(l,r,eps)*2.0);
return 0;
}
[日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法的更多相关文章
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- [NOI2005]月下柠檬树[计算几何(simpson)]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1169 Solved: 626[Submit][Status] ...
- BZOJ1502: [NOI2005]月下柠檬树
Simpson法相当好用啊!神奇的骗分算法! /************************************************************** Problem: 1502 ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- [NOI2005]月下柠檬树
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- BZOJ1502:[NOI2005]月下柠檬树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1502 https://www.luogu.org/problemnew/show/P4207 李哲 ...
随机推荐
- 【深度分析】:阿里,腾讯面试题 SpringBoot整合Spring MVC
Java学习总结 SpringBoot整合Spring MVC 1.SpringMVC概述 MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为 ...
- The Life out of coding_Employment_01
1.工作与个人价值 软技能读书笔记第一篇:--From 安晓辉 内生涯与外生涯 内生涯包括知识.技能.工作经验.心理素质.内心情感.行为习惯.视野.观念.职业心态.职业成熟度.心灵成长. 外生涯包括职 ...
- CorelDRAW常用工具:羽化工具
一.什么是羽化 羽化是针对素材中选区的一项编辑处理.有些新手可能还不理解"羽化"的具体效果,其实羽化就是达到素材选区内外衔接部分虚化,起到渐变的作用从而达到自然衔接效果的操作. C ...
- 初学者也能轻松做出好Beat:FPC鼓机使用教程
如果我们想用FL Studio制作一个鼓的声部,这时水果自带的鼓机FPC简直就是我们初学者的福音.因为它的操作比较简单,自带的鼓谱也很丰富,而且我们还可以对鼓的音色做细致的调整,或者是使用自己的采样替 ...
- LeetCode周赛#212
1631. 最小体力消耗路径 #并查集 #最短路径 题目链接 题意 给定一二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 \((row ...
- Fiddler 4 (过滤器的使用)
1.先找到过滤器并且勾选 2.勾选 并填写要过滤的地址 3.运行 最终效果如下
- 老猿学5G:融合计费基于QoS流计费QBC的触发器Triggers
☞ ░ 前往老猿Python博文目录 ░ 一.引言 SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量,而CTF什么时候触发流量上报是由CTF中的触发器来控制的.在<老猿学5G: ...
- PyQt(Python+Qt)学习随笔:树型部件QTreeWidget中判断项是否首列跨所有列展示的isFirstItemColumnSpanned方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在前面<PyQt(Python+Qt)学习随笔:QTreeWidgetItem项是否首列跨所有 ...
- PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及含义
在PyQt中,模型可以针对不同的组件(或者组件的不同部分,比如存储数据.界面展示数据.按钮的提示等)提供不同的数据.例如,Qt.DisplayRole用于视图的文本显示.通常来说,模型中的数据项包含一 ...
- PyQt(Python+Qt)学习随笔:使用pyqtConfigure建立信号和槽的连接
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在PyQt中,一般信号和槽的连接是通过connect方法建立的,语法如下: connect(slot ...