bzoj 1502 月下柠檬树【Simpson积分】
投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的。
公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆
然后simpson即可
eps大概1e-6
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1005;
const double eps=1e-6,inf=1e15;
double alp;
int n,m,num;
struct dian
{
    double x,y;
    dian (double X=0,double Y=0)
	{
		x=X; y=Y;
	}
};
struct yuan
{
    double r;
    dian c;
    yuan(dian a=(dian){0,0},double R=0)
	{
		c=a; r=R;
	}
}a[N];
struct xian
{
    dian s,t;
    double k,b;
    xian(dian S=(dian){0,0},dian T=(dian){0,0})
    {
        s=S,t=T;
        if(s.x>t.x) swap(s,t);
        k=(s.y-t.y)/(s.x-t.x);
        b=s.y-k*s.x;
    }
    double f(double x)
	{
		return k*x+b;
	}
}l[N];
int cmp(double x)
{
	if(fabs(x)<eps)
		return 0;
	return x<0? -1:1;
}
double f(double x)
{
    double re=0;
    for(int i=1;i<=n;i++)
        {
            double d=fabs(x-a[i].c.x);
            if(cmp(d-a[i].r)>0)
				continue;
            double len=2*sqrt(a[i].r*a[i].r-d*d);
            re=max(re,len);
        }
    for(int i=1;i<=num;i++)
        if(x>=l[i].s.x && x<=l[i].t.x)
			re=max(re,2*l[i].f(x));
    return re;
}
double sps(double l,double r,double now,double fl,double fr,double fm)
{//cout<<l<<" "<<r<<endl;
	double mid=(l+r)/2,ffl=f((l+mid)/2),ffr=f((mid+r)/2),p=(fl+fm+ffl*4)*(mid-l)/6,q=(fm+fr+ffr*4)*(r-mid)/6;
	if(cmp(now-p-q)==0)
		return now;
	else
		return sps(l,mid,p,fl,fm,ffl)+sps(mid,r,q,fm,fr,ffr);
}
int main()
{
    scanf("%d%lf",&n,&alp);
    double h,r;
    for(int i=1;i<=n+1;i++)
	{
        scanf("%lf",&h),
        a[i]=(yuan){((dian){(h/tan(alp))+a[i-1].c.x,0}),0};
	}
    for(int i=1;i<=n;i++)
        scanf("%lf",&r),a[i].r=r;
    double L=inf,R=-inf;
    for(int i=1;i<=n+1;i++)
        L=min(L,a[i].c.x-a[i].r),R=max(R,a[i].c.x+a[i].r);
    for(int i=1;i<=n;i++)
        {
            double d=a[i+1].c.x-a[i].c.x;
            if(cmp(d-fabs(a[i].r-a[i+1].r))<0) continue;
            double sina=(a[i].r-a[i+1].r)/d,cosa=sqrt(1-sina*sina);
            l[++num]=(xian){(dian){a[i].c.x+a[i].r*sina,a[i].r*cosa},(dian){a[i+1].c.x+a[i+1].r*sina,a[i+1].r*cosa}};
        }
    // printf("%.2lf\n",Simpson(L,R,Calc(L,R)));
	double fl=f(L),fr=f(R),fm=f((L+R)/2);
	printf("%.2lf\n",sps(L,R,(fl+4*fm+fr)*(R-L)/6,fl,fr,fm));
    return 0;
}
/*
2 0.72953
9.61090 0.26021 4.47090
2.98979 2.00036
*/
bzoj 1502 月下柠檬树【Simpson积分】的更多相关文章
- BZOJ 1502 月下柠檬树(simpson积分)
		题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ... 
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
		[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ... 
- BZOJ 1502 月下柠檬树(simpson积分)
		题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ... 
- 【BZOJ1502】【NOI2005】月下柠檬树      simpson 积分
		特别提醒:eps至少要5e-6 首先我们来研究下平行光对投影的影响. 一个二维的图形,若它与光屏平行,那么不论平行光与光屏的夹角为多少,所得图形与原图形全等的(只是位置会有影响) 通过这么一分析,我们 ... 
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
		1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ... 
- [NOI2005]月下柠檬树(计算几何+积分)
		题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ... 
- 【BZOJ-1502】月下柠檬树       计算几何 + 自适应Simpson积分
		1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ... 
- 【bzoj 1502】月下柠檬树
		月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ... 
- [BZOJ1502]月下柠檬树(自适应辛普森积分)
		1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status] ... 
随机推荐
- Python()-  面向对象三大特性----多态
			多态: python 生来支持多态白话:一种事物的多种形态 (动物可以继承给狗,也可以继承给猫) class Animal: pass class Dog(Animal): def attack(se ... 
- [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
			4722: 由乃 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 360 Solved: 131[Submit][Status][Discuss] D ... 
- 学习日常笔记<day15>mysql基础
			1.数据库入门 1.1数据库软件 数据库:俗称数据的仓库,方便管理数据的软件(或程序) 1.2市面上数据库软件 Oracle,甲骨文公司的产品. 当前最流行应用最广泛的数据库软件.和java语言兼容非 ... 
- Shiro note
			我们需要实现Realms的Authentication 和 Authorization.其中 Authentication 是用来验证用户身份,Authorization 是授权访问控制,用于对用户进 ... 
- javascript创建对象总结(javascript高级程序设计)
			1.工厂模式 这样的模式抽象创建详细对象的过程.用函数封装特定的接口来创建类. function createStudent(name) { var o = new Object(); o.name ... 
- influxDB系列(二)
			来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ... 
- Linux 上运行 mapreduce 类型错误
			1.ClassCastException 错误代码 /** * */ /** * @author hadoop * */ package WordCount; import java.io.IOExc ... 
- 【转】Selenium2学习路线
			课程大纲:第一部分:基础入门 第一课: SELENIUM2的原理介绍及环境搭建本节课主要讲解SELENIUM2的原理,让大家了解SELENIUM2的发展历程,同时解惑大家对自动化测试中产生的一些误区. ... 
- grep命令使用技巧
			grep如何实现全词查找例如:要查找name这个单词,反馈的查找结果不能包含namespace这样的模式,但是可以包含name()这样的模式,即要查找的单词两端不可以有其他的数字或者字母,但可以有空格 ... 
- Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现
			pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ... 
