Shadow of Survival
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相关推荐
- UE4风格化场景设计入门指南 Stylized Station – The Environment Artist’s Survival Kit
持续时间13h 1920X1080 .ts 包含项目文件 大小解压后:4.9G 语言:英语+中文字幕(人工校对) 标题:风格化的车站--环境艺术家的生存工具包 信息: 环境艺术很难. 尤其是作为初学者 ...
- centos 欢迎字符串_Centos系统用户密码字符串生成命令-shadow
这两天在看puppet,准备用这个管理我手下系统的用户添加分配与删除工作,不过每次要是都用系统的passwd命令生成用户密码那就有点太麻烦了,在网上找了一下,可以通过perl生成linux系统用户保存 ...
- Linux用户配置密码,linux用户配置文件passwd和密码配置文件shadow,用户管理,组管理...
一.linux和windows互传文件 1.安装支持包:lrzszyum -y install lrzszputty工具 不支持lrzsz 2.rz windows文件fail2ban-0.8.1 ...
- 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 ...
- R语言数据包自带数据集之survival包的colon数据集字段解释、数据导入实战
R语言数据包自带数据集之survival包的colon数据集字段解释.数据导入实战 #数据字段说明 colon数据集:B/C期结肠癌辅助化疗治疗数据 d # 患者编号 study # 所有患者都是1 ...
- R语言数据包自带数据集之survival包的lung数据集字段解释、数据导入实战
R语言数据包自带数据集之survival包的lung数据集字段解释.数据导入实战 目录 R语言数据包自带数据集之survival包的lung数据集字段解释.数据导入实战 #数据字段说明 #导入包 #导 ...
- python使用matplotlib可视化包含倒影的柱状图(bar plot with shadow)、配置rcParams坐标轴正确显示负号(-)
python使用matplotlib可视化包含倒影的柱状图(bar plot with shadow).配置rcParams坐标轴正确显示负号(-) 目录
- R语言生存分析(survival analysis)与生存资料有关的概念详解
R语言生存分析(survival analysis)与生存资料有关的概念详解 目录 R语言生存分析(survival analysis)与生存资料有关的概念详解 #生存分析
- 什么是生存分析(survival analysis)?
什么是生存分析(survival analysis)? 用来研究生存时间的分布规律以及生存时间和相关因索之间关系的一种统计分析方法 基本概念 失效事件(Failure Event):常被简称为事件,研 ...
最新文章
- 漫画:我用深度学习框架画下女朋友最美的脸
- 第十五届全国大学生智能车竞赛浙江赛区隆重开幕
- Android开发--蓝牙操作
- MySQL mysqldump命令
- POJ 3617 Best Cow Line 贪心算法
- spring的AOP配置之XML方式
- 迷宫求解无敌版(递归调用法)
- 学习笔记(32):Python网络编程并发编程-线程queue
- 多线程(C++)临界区Critical Sections
- lock 线程 java_JAVA多线程-基础Lock Condition 并发集合
- 解决mysql大小写敏感问题
- node开发命令行脚本
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
- CSS定位属性(position)
- Ubuntu安装Chromium
- java合并后求和_用分支/合并框架执行并行求和
- 第二次作业(个人作业):软件案例分析
- Kettle之数据同步
- kangle虚拟主机系统easypanel使用教程
- 阿米巴经营和数据分析