zoukankan      html  css  js  c++  java
  • HDU 5120 Intersection (求圆环相交面积)

    题意:给定圆环的内径r和外径R,以及2个相同圆环的圆心,求两个圆环的相交面积。

    思路

    S = A大B大 - A大B小 - A小B大 + A小B小。(A表示A环,大表示大圆,B同)

     1 #include <iostream>
     2 #include <queue>
     3 #include <stack>
     4 #include <cstdio>
     5 #include <vector>
     6 #include <map>
     7 #include <set>
     8 #include <bitset>
     9 #include <algorithm>
    10 #include <cmath>
    11 #include <cstring>
    12 #include <cstdlib>
    13 #include <string>
    14 #include <sstream>
    15 #include <time.h>
    16 #define x first
    17 #define y second
    18 #define pb push_back
    19 #define mp make_pair
    20 #define lson l,m,rt*2
    21 #define rson m+1,r,rt*2+1
    22 #define mt(A,B) memset(A,B,sizeof(A))
    23 using namespace std;
    24 typedef long long LL;
    25 typedef unsigned long long ull;
    26 const double PI = acos(-1);
    27 const int N=1e6+10;
    28 const LL mod=1e9+7;
    29 const int inf = 0x3f3f3f3f;
    30 const LL INF=0x3f3f3f3f3f3f3f3fLL;
    31 const double eps=1e-8;
    32 struct point
    33 {
    34     double x,y;
    35     point(){}
    36     point(double _x,double _y)
    37     {
    38         x=_x;
    39         y=_y;
    40     }
    41 };
    42 double dis(point a,point b)
    43 {
    44     return sqrt((a.x-b.x)*(a.x-b.x)+(b.y-a.y)*(b.y-a.y));
    45 }
    46 double cal(point c1,double r1,point c2,double r2)
    47 {
    48     double d=dis(c1,c2);
    49     if(r1+r2<d+eps)return 0;
    50     if(d<fabs(r1-r2)+eps)
    51     {
    52         double r=min(r1,r2);
    53         return PI*r*r;
    54     }
    55     double x=(d*d+r1*r1-r2*r2)/(2*d);
    56     double t1=acos(x/r1);
    57     double t2=acos((d-x)/r2);
    58     return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);
    59 }
    60 int main()
    61 {
    62 #ifdef Local
    63     freopen("data.h","r",stdin);
    64 #endif
    65     //ios::sync_with_stdio(false);
    66     //cin.tie(0);
    67     int cas=1,T,n,m;
    68     scanf("%d",&T);
    69     while(T--)
    70     {
    71         double r,R,ans;
    72         struct point p,q;
    73         cin>>r>>R;
    74         cin>>p.x>>p.y;
    75         cin>>q.x>>q.y;
    76         if(dis(p,q)>=2*R)ans=0;
    77         else
    78         {
    79             if(dis(p,q)>=2*r)
    80             {
    81                 ans=cal(p,R,q,R)-cal(p,r,q,R)-cal(q,r,p,R);
    82             }
    83             else
    84             {
    85                 ans=cal(p,R,q,R)-cal(p,r,q,R)-cal(q,r,p,R)+cal(q,r,p,r);
    86             }
    87         }
    88         printf("Case #%d: %lf
    ",cas++,ans);
    89     }
    90 #ifdef Local
    91     cerr << "time: " << (LL) clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    92 #endif
    93    return 0;
    94 }
    View Code
  • 相关阅读:
    C++new失败的处理
    [转]va_start和va_end使用详解
    zookeeper的一些异常总结
    无法产生coredump的问题
    [译]AMQP 0-9-1 Quick Reference : basic
    阿里巴巴分布式数据库同步系统(解决中美异地机房)
    第一步(搭建阿里云主机服务器): 如何在远程Linux服务器上搭建Nginx
    iOS响应事件传递, nextResponder研究
    五个在Safari浏览器上的实用快捷键使用
    git three
  • 原文地址:https://www.cnblogs.com/27sx/p/7260403.html
Copyright © 2011-2022 走看看