Shadow of Survival

题目链接:http://dutacm.club:7217/codesheaven/problem.php?id=1083

题目大意:给出一个由圆台构成的塔和一个点光源,问塔的阴影面积.

Simpson积分

注意到圆台底面由点光源投影后仍为圆(对应弦成正比),于是就与这道题类似http://www.cnblogs.com/barrier/p/6512826.html.不再赘述,经测试eps取1e-5时最优.

/*需要注意的是,#define Abs(x) (x>0?x:-x) 这种写法可能会因为x为复合表达式而导致运算错误*/

代码如下:

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #define N 1005
 5 using namespace std;
 6 const double eps=1e-5;
 7 const double inf=1e12;
 8 double d,z;
 9 int n,k;
10 int dcmp(double x){
11     if(fabs(x)<eps)return 0;
12     else return x<0?-1:1;
13 };
14 struct point{
15     double x,y;
16     point(double X=0,double Y=0){x=X;y=Y;}
17 };
18 struct circle{
19     point o;
20     double r;
21     circle(point O=point(0,0),double R=0){o=O;r=R;}
22     bool within(circle tmp){
23         return fabs(o.x-tmp.o.x)-fabs(r-tmp.r)<=0;
24     }
25     bool xin(double x){
26         return o.x-r<=x&&x<=o.x+r;
27     }
28 }c[N];
29 struct line{
30     point s,t;
31     double k,b;
32     line(point S=point(-1,0),point T=point(1,0)){
33         s=S;t=T;
34         if(s.x>t.x)swap(s,t);
35         k=(s.y-t.y)/(s.x-t.x);
36         b=s.y-k*s.x;
37     }
38     bool xin(double x){
39         return s.x<=x&&x<=t.x;
40     }
41     double f(double x){
42         return k*x+b;
43     }
44 }l[N];
45 void init(){
46     scanf("%lf",&c[0].r);
47     c[0].o=point(0,0);
48     k=0;
49     for(int i=1;i<n;++i){
50         double h,r;
51         scanf("%lf%lf",&h,&r);
52         c[i]=circle(point(h*d/(z-h),0),z*r/(z-h));
53     }
54     for(int i=1;i<n;++i){
55         if(c[i].within(c[i-1]))continue;
56         double sin_theta=(c[i].r-c[i-1].r)/(c[i].o.x-c[i-1].o.x);
57         double cos_theta=sqrt(1-sin_theta*sin_theta);
58         l[k++]=line(point(c[i-1].o.x-c[i-1].r*sin_theta,c[i-1].r*cos_theta),
59                     point(c[i].o.x-c[i].r*sin_theta,c[i].r*cos_theta));
60     }
61 }
62 double F(double x){
63     double len=0;
64     for(int i=0;i<n;++i){
65         if(c[i].xin(x)){
66             double d=c[i].o.x-x;
67             len=max(len,2*sqrt(c[i].r*c[i].r-d*d));
68         }
69     }
70     for(int i=0;i<k;++i)
71         if(l[i].xin(x))
72             len=max(len,2*l[i].f(x));
73     return len;
74 }
75 double cal(double l,double r){
76     return (F(l)+4*F((l+r)/2)+F(r))/6*(r-l);
77 }
78 double simpson(double l,double r,double s){
79     double mid=(l+r)/2;
80     double x=cal(l,mid),y=cal(mid,r);
81     if(!dcmp(x+y-s))return s;
82     else return simpson(l,mid,x)+simpson(mid,r,y);
83 }
84 void solve(){
85     double L=inf,R=-inf;
86     for(int i=0;i<n;++i){
87         L=min(L,c[i].o.x-c[i].r);
88         R=max(R,c[i].o.x+c[i].r);
89     }
90     printf("%.2lf\n",simpson(L,R,cal(L,R)));
91 }
92 int main(void){
93     while(~scanf("%lf%lf%d",&d,&z,&n)){
94         init();
95         solve();
96     }
97 }

转载于:https://www.cnblogs.com/barrier/p/6523759.html

Shadow of Survival相关推荐

  1. UE4风格化场景设计入门指南 Stylized Station – The Environment Artist’s Survival Kit

    持续时间13h 1920X1080 .ts 包含项目文件 大小解压后:4.9G 语言:英语+中文字幕(人工校对) 标题:风格化的车站--环境艺术家的生存工具包 信息: 环境艺术很难. 尤其是作为初学者 ...

  2. centos 欢迎字符串_Centos系统用户密码字符串生成命令-shadow

    这两天在看puppet,准备用这个管理我手下系统的用户添加分配与删除工作,不过每次要是都用系统的passwd命令生成用户密码那就有点太麻烦了,在网上找了一下,可以通过perl生成linux系统用户保存 ...

  3. Linux用户配置密码,linux用户配置文件passwd和密码配置文件shadow,用户管理,组管理...

    一.linux和windows互传文件 1.安装支持包:lrzszyum -y install   lrzszputty工具 不支持lrzsz 2.rz windows文件fail2ban-0.8.1 ...

  4. linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow—关于用户和组的配置文件

    1./etc/passwd  存储用户信息 [root@oldboy ~]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bi ...

  5. R语言数据包自带数据集之survival包的colon数据集字段解释、数据导入实战

    R语言数据包自带数据集之survival包的colon数据集字段解释.数据导入实战 #数据字段说明 colon数据集:B/C期结肠癌辅助化疗治疗数据 d # 患者编号 study # 所有患者都是1 ...

  6. R语言数据包自带数据集之survival包的lung数据集字段解释、数据导入实战

    R语言数据包自带数据集之survival包的lung数据集字段解释.数据导入实战 目录 R语言数据包自带数据集之survival包的lung数据集字段解释.数据导入实战 #数据字段说明 #导入包 #导 ...

  7. python使用matplotlib可视化包含倒影的柱状图(bar plot with shadow)、配置rcParams坐标轴正确显示负号(-)

    python使用matplotlib可视化包含倒影的柱状图(bar plot with shadow).配置rcParams坐标轴正确显示负号(-) 目录

  8. R语言生存分析(survival analysis)与生存资料有关的概念详解

    R语言生存分析(survival analysis)与生存资料有关的概念详解 目录 R语言生存分析(survival analysis)与生存资料有关的概念详解 #生存分析

  9. 什么是生存分析(survival analysis)?

    什么是生存分析(survival analysis)? 用来研究生存时间的分布规律以及生存时间和相关因索之间关系的一种统计分析方法 基本概念 失效事件(Failure Event):常被简称为事件,研 ...

最新文章

  1. 漫画:我用深度学习框架画下女朋友最美的脸
  2. 第十五届全国大学生智能车竞赛浙江赛区隆重开幕
  3. Android开发--蓝牙操作
  4. MySQL mysqldump命令
  5. POJ 3617 Best Cow Line 贪心算法
  6. spring的AOP配置之XML方式
  7. 迷宫求解无敌版(递归调用法)
  8. 学习笔记(32):Python网络编程并发编程-线程queue
  9. 多线程(C++)临界区Critical Sections
  10. lock 线程 java_JAVA多线程-基础Lock Condition 并发集合
  11. 解决mysql大小写敏感问题
  12. node开发命令行脚本
  13. 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
  14. CSS定位属性(position)
  15. Ubuntu安装Chromium
  16. java合并后求和_用分支/合并框架执行并行求和
  17. 第二次作业(个人作业):软件案例分析
  18. Kettle之数据同步
  19. kangle虚拟主机系统easypanel使用教程
  20. 阿米巴经营和数据分析

热门文章

  1. EasyUI datagrid控件的基本使用
  2. 汇编语言int 13中断02h功能Demo - 使用emu8086
  3. .net (object sender, EventArgs e) 学习总结
  4. 第四周课程总结及实验报告
  5. Appium进行iOS自动化测试时遇到的问题及解决办法
  6. 3-2.6==0.4
  7. Linux:目录操作
  8. linux学习——大话linux网络
  9. WP8模拟器启动失败解决方法
  10. linux树莓派连接wifi密码,树莓派连接WiFi,不使用界面,多WiFi切换