【bzoj 1502】月下柠檬树
月下柠檬树
题意
求n个圆与他们的公切线的定积分。
解法
求出圆的公切线就可以了。
特别坑的一点 :
最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端。
比较坑的一点 :
精度要设小一点,不然会TLE。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=0;T k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=(500+5)*2;
struct cir{
double x,r;
double h(double k){
double d=fabs(k-x);
return sqrt(r*r - d*d);
}
}c[maxn];
struct lin{
// y=kx+b
double k,b,lx,ly;
double h(double x){
return x*k+b;
}
}p[maxn];
int n;
double F(double x){
double ans=0.0;
for(int i=1;i<=n;i++){
if(x>(c[i].x-c[i].r)&&x<(c[i].x+c[i].r))
ans=max(ans,c[i].h(x));
}
for(int i=1;i<n;i++){
if(x>=p[i].lx&&x<=p[i].ly)
ans=max(ans,p[i].h(x));
}
return ans;
}
double simpson(double a,double b){
double mid=(a+b)/2;//*0.5???
return ( F(a) + 4*F(mid) + F(b) ) * (b-a)/6;
}
double asr(double a,double b,double eps,double A){
double mid = (a+b)/2;
double L = simpson(a,mid) , R = simpson(mid,b);
if(fabs(L+R-A) <= 15*eps) return L+R+(L+R-A)/15;
return asr(a,mid,eps/2,L) + asr(mid,b,eps/2,R);
}
double asr(double l,double r,double eps){
return asr(l,r,eps,simpson(l,r));
}
double alpha;
double h[maxn];
int main()
{
scanf("%d%lf",&n,&alpha);n++;
alpha= 1.0 / tan(alpha);
for(int i=1;i<=n;i++) scanf("%lf",&h[i]);
for(int i=1;i<n;i++) scanf("%lf",&c[i].r);c[n].r=0.0;
for(int i=1;i<=n;i++) c[i].x=c[i-1].x+h[i];
for(int i=1;i<=n;i++) c[i].x*=alpha;
for(int i=1;i<n;i++){
if((c[i+1].x+c[i+1].r)<=(c[i].x+c[i].r)) continue;
if(fabs(c[i].r-c[i+1].r)<=1e-6){
p[i].lx=c[i].x,p[i].ly=c[i+1].x;
p[i].k=0.0;p[i].b=c[i].r;
continue;
}
if(c[i].r<c[i+1].r){
double _cos=(c[i+1].r-c[i].r)/(c[i+1].x-c[i].x);
double d=_cos*c[i+1].r;
double y2 = sqrt(c[i+1].r*c[i+1].r - d*d);
p[i].ly=c[i+1].x-d;
d=_cos*c[i].r;
double y1 = sqrt(c[i].r*c[i].r - d*d);
p[i].lx=c[i].x-d;
p[i].k = (y1-y2)/(p[i].lx-p[i].ly);
p[i].b = y1 - p[i].k*p[i].lx;
}
else{
double _cos=(c[i].r-c[i+1].r)/(c[i+1].x-c[i].x);
double d=_cos*c[i].r;
p[i].lx=c[i].x+d;
double y1 = sqrt(c[i].r*c[i].r - d*d);
d=_cos*c[i+1].r;
double y2 = sqrt(c[i+1].r*c[i+1].r - d*d);
p[i].ly=c[i+1].x+d;
p[i].k = (y1-y2)/(p[i].lx-p[i].ly);
p[i].b = y1 - p[i].k*p[i].lx;
}
}
//*****
double ll=c[1].x-c[1].r,rr=c[n].x;
for(int i=1;i<=n;i++){
double l=c[i].x-c[i].r,r=c[i].x+c[i].r;
ll=min(l,ll);rr=max(rr,r);
}
printf("%.2lf",2*asr(ll,rr,1e-6));
return 0;
}
【bzoj 1502】月下柠檬树的更多相关文章
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- BZOJ 1502 月下柠檬树(simpson积分)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...
- bzoj 1502 月下柠檬树【Simpson积分】
投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的. 公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆 然后simpson即 ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- 【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]月下柠檬树(自适应辛普森积分)
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status] ...
- [NOI2005]月下柠檬树
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
随机推荐
- TCP连接的11中状态
1.CLOSED:初始状态,表示TCP连接时关闭状态,没有任何连接. 2.LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接收客户端的连接请求. 3.SYN_RCVD:表示服务器接收到来 ...
- alsa文章
http://blog.csdn.net/azloong/article/details/6140824 http://blog.csdn.net/tianshuai1111/article/deta ...
- Python 使用matplotlib模块模拟掷骰子
掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""&quo ...
- 洛谷 P1137 旅行计划 (拓扑排序+dp)
在DAG中,拓扑排序可以确定dp的顺序 把图的信息转化到一个拓扑序上 注意转移的时候要用边转移 这道题的dp是用刷表法 #include<bits/stdc++.h> #define RE ...
- 机房-动环-江森ODS系统
优势: 标准的BACnet系统平台 开放的集成特性 支持Desktop and Server平台 支持多达100个NxE 支持无线应用,可以手机访问 DCIM---数据中心基础架构管理平台介绍 不同于 ...
- Eclipse-去除空白行
CTRL+F Find: ^\s*\n 注意前后不要有空白 Replace With: 为空,不填 勾选:Regular expressions 正则表达式 替 ...
- Linux线程资源限制
- 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&攻略+SSG改动+打开存档补丁]
冒险者们哟.寻找龙秘玉吧--! ninetail的最新作,是使用丰富多彩的技能·道具探索迷宫的3D迷宫RPG! 存在着骑士和神官的架空世界常见的职业为首的13种职业.超过数百种的道具的登场! 和伙伴一 ...
- 安卓项目开发实战(1)--首页顶部菜单BAR实现
从今天開始,我将開始自己手写一个星座运势的项目,星座运势的数据来源採用MYAPI的星座数据,client全然自己实现. 这个系列主要是讲project中主要界面的布局展示和一些项目中的难点解析.因为本 ...
- 图像算法研究---Adaboost算法具体解释
本篇文章先介绍了提升放法和AdaBoost算法.已经了解的可以直接跳过.后面给出了AdaBoost算法的两个样例.附有详细计算过程. 1.提升方法(来源于统计学习方法) 提升方法是一种经常使用的统计学 ...