题意:

一颗树由n个圆台组成,现在有倾斜角为alpha的光;

不计树干阴影,光线沿直线传播,求这个树在水平地面投影的面积;

n<=500,0.3<alpha<π/2;

题解:

给出一颗树。。求这棵树的阴影面积。。。

什么鬼题!= =

当然这是一道计算几何;

首先我们把树的尖看成半径为0的圆;

三维图形到二维的投影貌似很难啊,不过这题也有很多特殊性;

因为圆对于平行的面的投影都是相同的正圆,所以可以直接投在地面上;

而圆心距则是除了一个tan函数的样子,所以圆已经被扔到待求的平面上了;

曾经的圆台的母线,现在是什么呢?

这些圆的公切线!(这样就从母的变成公的啦233)

公切线的求法就是画图上勾股定理相似乱搞,调两组数据改改就好了;

然后正解似乎是讨论了一堆东西然后分别求面积;

然后我们似乎可以直接上Simpson积分!

具体细节不说了,代码里都有;

这题精度不是特别卡,EPS=1e5就够了?

代码:

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 550
#define pr pair<double,double>
using namespace std;
const double EPS=1e-5;
const double INF=1e100;
struct Point
{double x,y;Point(){}Point(double _,double __):x(_),y(__){}friend Point operator +(Point a,Point b){return Point(a.x+b.x,a.y+b.y);}friend Point operator -(Point a,Point b){return Point(a.x-b.x,a.y-b.y);}friend Point operator *(double a,Point b){return Point(a*b.x,a*b.y);}
};
struct Line
{Point p,v;Line(){};Line(Point _,Point __){p=_,v=__-_;}pr f(double x){if(x<p.x||x>(p+v).x) return pr(0,0);double ret=(p+(x-p.x)/v.x*v).y;return pr(-ret,ret);}
}l[N];
struct Circle
{Point p;double r;pr f(double x){if(r-fabs(x-p.x)<=0)   return pr(0,0);double ret=sqrt(r*r-(x-p.x)*(x-p.x));return pr(-ret,ret);}
}O[N];
int n,tot;
pr p[N<<1];
void getL(Circle A,Circle B)
{double c=B.p.x-A.p.x;if(c+A.r<=B.r||c+B.r<=A.r) return ;double a=B.r-A.r;double b=sqrt(c*c-a*a);Point lp=A.p-Point(A.r/c*a,-A.r/c*b),rp=B.p-Point(B.r/c*a,-B.r/c*b);//rp++l[++tot]=Line(lp,rp);
}
double Cut(double x)
{int cnt=0;double ret=0,last=-INF;for(int i=1;i<=tot;i++){p[++cnt]=l[i].f(x);if(p[cnt]==pr(0,0)) cnt--;}for(int i=1;i<=n;i++){p[++cnt]=O[i].f(x);if(p[cnt]==pr(0,0)) cnt--;}sort(p+1,p+cnt+1);for(int i=1;i<=cnt;i++){if(p[i].first>last)ret+=p[i].second-p[i].first,last=p[i].second;else if(p[i].second>last)ret+=p[i].second-last,last=p[i].second;}return ret;
}
double Simpson(double l,double r,double mid,double Cl,double Cr,double Cm)
{double tCl=Cut((l+mid)/2),tCr=Cut((mid+r)/2);double ans=(r-l)*(Cl+Cr+4*Cm)/6;double lans=(mid-l)*(Cl+Cm+4*tCl)/6,rans=(r-mid)*(Cm+Cr+4*tCr)/6;if(fabs(lans+rans-ans)<EPS)return ans;elsereturn Simpson(l,mid,(l+mid)/2,Cl,Cm,tCl)+Simpson(mid,r,(mid+r)/2,Cm,Cr,tCr);
}
int main()
{int m,i,j,k;double alpha,h,l,r;scanf("%d%lf",&n,&alpha);n++;alpha=1.0/tan(alpha);for(i=1;i<=n;i++){scanf("%lf",&h);O[i].p.x=O[i-1].p.x+h*alpha;}for(i=1,l=INF,r=-INF;i<n;i++){scanf("%lf",&O[i].r);l=min(l,O[i].p.x-O[i].r);r=max(r,O[i].p.x+O[i].r);}l=min(l,O[n].p.x-O[n].r);r=max(r,O[n].p.x+O[n].r);for(i=1;i<n;i++){getL(O[i],O[i+1]);}printf("%.2lf\n",Simpson(l,r,(l+r)/2,0,0,Cut((l+r)/2)));return 0;
}

bzoj-1502 月下柠檬树相关推荐

  1. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

  2. bzoj 1502月下柠檬树 Simpson积分

    关键点是,水平的圆投影到水平面之后仍然是与原先全等的圆. 然后圆与圆之间通过曲面无缝连接,所以投影下来之后圆与圆之间通过公切线连接. 直接求有点难.把投影区域的上边界当成一个函数,然后套Simpson ...

  3. HYSBZ - 1502 月下柠檬树【辛普森积分】

    李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地 坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月光的照射 ...

  4. BZOJ 1502:月下柠檬树

    BZOJ 1502:月下柠檬树 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题目大意:给出一棵由圆台构成的树以及一个平行光源,问 ...

  5. BZOJ 1502: [NOI2005]月下柠檬树 simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1244  Solved: 662 [Submit][Statu ...

  6. 【bzoj 1502】月下柠檬树

    月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...

  7. 1502: [NOI2005]月下柠檬树

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1077  Solved: 600 [Submit][Statu ...

  8. [BZOJ1502]月下柠檬树(自适应辛普森积分)

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1387  Solved: 739 [Submit][Statu ...

  9. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1017  Solved: 562 [Submit][Statu ...

  10. 【NOI2005】 月下柠檬树

    题目描述 月下柠檬树 主文件名:lemon [问题描述] 李哲非常非常喜欢柠檬树, 特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时, 他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 ...

最新文章

  1. 10061 mysql,Navicat无法连接到MySQL server的10061错误
  2. 谈谈Promise的前世今生
  3. 第五十期:详解语音识别技术的发展
  4. Linux用户不在sudoers文件中
  5. 【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
  6. 如何重新安装微软应用商店
  7. LoadRunner压力测试
  8. 图像原始格式 YUV444 YUV422 YUV420 详细解析
  9. Sniffer和网络执法官软件助你维护网络
  10. vue 渲染函数处理slot_Vue渲染函数详解
  11. 信号完整性与电源完整性分析 第三版 pdf_信号完整性揭秘于博士SI设计手记高清PDF分享...
  12. The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 0 维度不匹配
  13. java 实现限流器,可用于Rest接口请求处理 | Java工具类
  14. 7个实用的Python自动化测试框架
  15. python 导入sklearn时报错: no model named ‘murmurhash‘
  16. adb命令之pm hide 与 disable
  17. 在S3C6410开发板上的LED驱动程序
  18. android备忘录备份,安卓手机备忘录怎么转到新手机?
  19. 简单的个人健康记录系统(Android+Web)
  20. 51Nod1011 最大公约数GCD(C语言)

热门文章

  1. java如何文档生成目录
  2. 老字号,没那么容易倒——wifi共享精灵
  3. 甲骨文VPS安装FRP实现内网映射
  4. Androidの网络通信之TDP
  5. 金山词霸2007注册码
  6. sundancest201驱动_MikroTik RouterOS 2.9硬件支持列表
  7. 【邢不行|量化小讲堂系列43-实战篇】:在量化投资中,原来K线还能这么画(附画K线代码)
  8. 周鸿祎谈程序员 35 岁就会被淘汰:越老越吃香;谷歌 AR 眼镜项目前光学工程师吐槽:开发团队都不想佩戴|极客头条...
  9. 奋斗吧,程序员——第二十五章 酒酣胸胆尚开张,鬓微霜,又何妨
  10. RuntimeError: implement_array_function method already has a docstring