Antinomy与爆炸
链接:https://ac.nowcoder.com/acm/problem/230728
来源:牛客网
题目描述
橘猫忍要爆炸了!!!!!!!!!!!!!!!!
你必须立刻前往Antinomy提供的安全区进行躲避!!!!!!!!!!!!!
橘猫忍一共爆炸 \mathit tt 次,且每次都是在二维平面的原点处呈圆形爆炸,每次圆形爆炸的伤害半径 \mathit rr都不同。
在每一次爆炸里,都有一个矩形安全区,安全区可以规避你在圆形爆炸之外的冲击波的伤害,但无法规避在圆形爆炸内的伤害。
Pi想知道每次爆炸的时候,安全区里不安全的面积是多少。
抽象一点来说,对于每一次爆炸,你都需要计算圆形和矩形的重叠面积。
数据范围:
这样我们大致可以分类,然后把计算模块化
分类标准:几个点在园内,写一个judge函数来判断
这种情况易于计算
以该情况为标准,写计算重叠面积的函数
延长另外两条边,均可以找到和上一种情况类似的点,然后面积相减
代码
#include<bits/stdc++.h> using namespace std; #define fi first #define se second typedef pair<double,double>PII; bool judge(PII a,double r) { if(a.fi*a.fi+a.se*a.se>r*r) //注意这里判断时我们把在园上的点也算入圆上 { return false; }else { return true; } } double s(PII a,PII b,PII c,double r) { double x=(a.fi*c.fi+a.se*c.se)/(r*r); //向量积/(模*模) double angel=acos(x); double s=1/2.0*angel*r*r; double s1=(a.se-b. se)*b.fi/2.0; double s2=(c.fi-b.fi)*b.se/2.0; return s-s1-s2; } double cal(double y,double r) { return sqrt(r*r-y*y); //模块化计算每个点在圆上的另外一个坐标 如代入x计算y,带入y计算出x } signed main() { int t; cin>>t; while(t--) { double x1,x2,y1,y2,r; cin>>x1>>y1>>x2>>y2>>r; PII a={x1,y2},b={x1,y1},c={x2,y1},d={x2,y2}; if(!judge(b,r)) { cout<<0<<'\n'; }else if(judge(d,r)) { printf("%.4f\n",(y2-y1)*(x2-x1)); }else { if(judge(b,r)&&!judge(a,r)&&!(judge(c,r))&&!judge(d,r)) { PII zs={x1,cal(x1,r)},yx={cal(y1,r),y1}; double result=s(zs,b,yx,r); printf("%.4f\n",result); }else if(judge(b,r)&&judge(a,r)&&!(judge(c,r))&&!judge(d,r)) { PII zs={x1,cal(x1,r)},yx={(cal(y1,r)),y1}; double res1=s(zs,b,yx,r); PII ex={cal(y2,r),y2}; double res2=s(zs,a,ex,r); printf("%.4f\n",res1-res2); }else if(judge(b,r)&&!judge(a,r)&&(judge(c,r))&&!judge(d,r)) { PII zs={x1,cal(x1,r)},yx={(cal(y1,r)),y1}; double res1=s(zs,b,yx,r); PII ex={x2,cal(x2,r)}; double res2=s(ex,c,yx,r); printf("%.4f\n",res1-res2); }else if(judge(b,r)&&judge(a,r)&&(judge(c,r))&&!judge(d,r)) { PII yx={x2,cal(x2,r)},zs={cal(y2,r),y2}; double s1=s(zs,{cal(y2,r),cal(x2,r)},yx,r); double s2=(y2-cal(x2,r))*(x2-cal(y2,r)); double res=s2-s1; double res2=(x2-x1)*(y2-y1); double res3=res2-res; printf("%.4f\n",res3); } } } }
本文作者:TimMCBen
本文链接:https://www.cnblogs.com/TimMCBen/p/16040185.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
标签:
数学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步