結果
| 問題 | No.3672 Volume 3D |
| コンテスト | |
| ユーザー |
harurun
|
| 提出日時 | 2026-08-05 03:32:03 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 87 ms / 2,000 ms |
| + 606µs | |
| コード長 | 2,170 bytes |
| 記録 | |
| コンパイル時間 | 2,307 ms |
| コンパイル使用メモリ | 350,728 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-09-04 22:02:17 |
| 合計ジャッジ時間 | 6,475 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
static long double intersectionVolume(
long long xa, long long ya, long long za, long long ra_i,
long long xb, long long yb, long long zb, long long rb_i
) {
const long long dx_i = xa - xb;
const long long dy_i = ya - yb;
const long long dz_i = za - zb;
const __int128 d2_integer =
static_cast<__int128>(dx_i) * dx_i
+ static_cast<__int128>(dy_i) * dy_i
+ static_cast<__int128>(dz_i) * dz_i;
const long long sum_i = ra_i + rb_i;
const long long diff_i = llabs(ra_i - rb_i);
const __int128 sum2_integer = static_cast<__int128>(sum_i) * sum_i;
const __int128 diff2_integer = static_cast<__int128>(diff_i) * diff_i;
const long double ra = static_cast<long double>(ra_i);
const long double rb = static_cast<long double>(rb_i);
const long double pi = acosl(-1.0L);
if (d2_integer >= sum2_integer) {
return 0.0L;
}
if (d2_integer <= diff2_integer) {
const long double r = min(ra, rb);
return 4.0L * pi * r * r * r / 3.0L;
}
const long double d2 = static_cast<long double>(d2_integer);
const long double d = sqrtl(d2);
const long double sum_r = ra + rb;
// sum_r - d を直接計算すると、外接直前で有効桁を失う。
const long double overlap_depth =
(sum_r * sum_r - d2) / (sum_r + d);
const long double radius_difference = ra - rb;
const long double bracket =
d2 + 2.0L * d * sum_r
- 3.0L * radius_difference * radius_difference;
long double answer =
pi * overlap_depth * overlap_depth * bracket / (12.0L * d);
if (answer < 0.0L && answer > -1e-18L) answer = 0.0L;
return answer;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
cout << scientific << setprecision(20);
for (int test_case = 0; test_case < T; ++test_case) {
long long xa, ya, za, ra;
long long xb, yb, zb, rb;
cin >> xa >> ya >> za >> ra;
cin >> xb >> yb >> zb >> rb;
cout << intersectionVolume(xa, ya, za, ra, xb, yb, zb, rb) << '\n';
}
return 0;
}
harurun