結果

問題 No.764 浮動点
ユーザー ytftytft
提出日時 2021-04-08 19:33:36
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,281 bytes
コンパイル時間 1,756 ms
コンパイル使用メモリ 169,656 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-23 22:28:07
合計ジャッジ時間 3,119 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 WA -
testcase_04 AC 5 ms
6,940 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 AC 5 ms
6,940 KB
testcase_09 WA -
testcase_10 AC 5 ms
6,944 KB
testcase_11 WA -
testcase_12 AC 5 ms
6,944 KB
testcase_13 AC 5 ms
6,940 KB
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 AC 4 ms
6,940 KB
testcase_19 AC 4 ms
6,940 KB
testcase_20 AC 5 ms
6,940 KB
testcase_21 WA -
testcase_22 AC 5 ms
6,944 KB
testcase_23 AC 5 ms
6,944 KB
testcase_24 WA -
testcase_25 AC 3 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
double calc(double r1,double r2,double d){
    const double pi=3.14159265358979323846;
    if(r1+d<=r2){
        return r1*r1*pi;
    }
    if(r2+d<=r1){
        return r2*r2*pi;
    }
    if(r2+r1<=d){
        return 0;
    }
    double d1,d2,h;
    d1=(d+(r1*r1-r2*r2)/d)/2;
    d2=(d-(r1*r1-r2*r2)/d)/2;
    h=sqrt(r2*r2-d2*d2);
    return r1*r1*asin(h/r1)+r2*r2*asin(h/r2)-d2*h-d1*h;
}

int main(){
    int N;
    double d;
    cin>>N>>d;
    vector<double> dist(N+1);
    for(int i=0;i<N+1;i++){
        cin>>dist[i];
    }
    vector<double> rightsum(N),leftsum(N),rightmax(N),leftmax(N);
    rightsum[0]=dist[0];
    rightmax[0]=dist[0];
    for(int i=1;i<N;i++){
        rightsum[i]=rightsum[i-1]+dist[i];
        rightmax[i]=max(rightmax[i-1],dist[i]);
    }
    leftsum[N-1]=dist[N];
    leftmax[N-1]=dist[N];
    for(int i=N-2;i>=0;i--){
        leftsum[i]=leftsum[i+1]+dist[i+1];
        leftmax[i]=max(leftmax[i+1],dist[i+1]);
    }
    double a,b,am,bm;
    for(int i=0;i<N;i++){
        a=leftsum[i];
        b=rightsum[i];
        am=max(0.0,leftmax[i]*2-leftsum[i]);
        bm=max(0.0,rightmax[i]*2-rightsum[i]);
        printf("%.8f",calc(a,b,d)+calc(am,bm,d)-calc(a,bm,d)-calc(am,b,d));
        cout<<endl;
    }

}
0