QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#64253 | #2839. 3D Geometry | lyhy | AC ✓ | 149ms | 3680kb | C++14 | 2.5kb | 2022-11-24 14:20:44 | 2022-11-24 14:21:09 |
Judging History
answer
#include<iostream>
#include<math.h>
#include<bits/stdc++.h>
using namespace std;
int x[5], y[5], z[5];
double aa, bb, cc, all;
int get(int l, int r){
return rand() % (r - l + 1) + l;
}
double ask(int x0, int y0, int z0){
double ret;
x[1] -= x0; x[2] -= x0;
y[1] -= y0; y[2] -= y0;
z[1] -= z0; z[2] -= z0;
// cout << "begin\n";
// cout << x[1] << " " << y[1] << " " << z[1] << endl;
// cout << x[2] << " " << y[2] << " " << z[2] << endl;
int x1 = x[2], y1 = y[1], z1 = z[1];
int x2 = x[1], y2 = y[2], z2 = z[1];
int x3 = x[1], y3 = y[1], z3 = z[2];
int a = (y2 - y1) * (z3 - z1) - (y3 - y1) * (z2 - z1);
int b = (z2 - z1) * (x3 - x1) - (z3 - z1) * (x2 - x1);
int c = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
int d = - a * x1 - b * y1 - c * z1;
double xx = 1.0 * (-d) / a;
double yy = 1.0 * (-d) / b;
double zz = 1.0 * (-d) / c;
// cout << xx << " " << yy << " " << zz << endl;
xx = min(xx, (double)x[2]) - max(0, x[1]);
yy = min(yy, (double)y[2]) - max(0, y[1]);
zz = min(zz, (double)z[2]) - max(0, z[1]);
double k = min({xx / aa, yy / bb, zz / cc});
if(k < 0) ret = 0;
else ret = all * k * k * k;
// ret = xx * yy * zz / 6;
// cout << " xyz : " << xx << " " << yy << " " << zz << endl;
x[1] += x0; x[2] += x0;
y[1] += y0; y[2] += y0;
z[1] += z0; z[2] += z0;
// cout << x0 << " " << y0 << " " << z0 << " " << ret << " ";
return ret;
}
int main(){
std::ios::sync_with_stdio(false);
srand(time(0));
while(cin >> x[1] >> y[1] >> z[1]){
for(int i = 2; i <= 4; i ++){
cin >> x[i] >> y[i] >> z[i];
x[i] -= x[1];
y[i] -= y[1];
z[i] -= z[1];
}
x[1] = y[1] = z[1] = 0;
if(x[2] < 0)
for(int i = 1; i <= 4; i ++)
x[i] = -x[i];
if(y[2] < 0)
for(int i = 1; i <= 4; i ++)
y[i] = -y[i];
if(z[2] < 0)
for(int i = 1; i <= 4; i ++)
z[i] = -z[i];
aa = x[2];
bb = y[2];
cc = z[2];
all = aa * bb * cc / 6.0;
if(x[3] > x[4]) swap(x[3], x[4]);
if(y[3] > y[4]) swap(y[3], y[4]);
if(z[3] > z[4]) swap(z[3], z[4]);
// cout << endl;
// for(int i = 1; i <= 4; i ++)
// cout << x[i] << " " << y[i] << " " << z[i] << endl;
// ask(-1, -1, -1);
double ans = ask(x[3], y[3], z[3])
- ask(x[4], y[3], z[3]) - ask(x[3], y[4], z[3]) - ask(x[3], y[3], z[4])
+ ask(x[3], y[4], z[4]) + ask(x[4], y[3], z[4]) + ask(x[4], y[4], z[3])
- ask(x[4], y[4], z[4]);
printf("%.8lf\n", fabs(ans));
}
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 3680kb
input:
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 2 2 2 0 0 0 1 1 1 0 2 0 2 0 2 1 0 1 0 1 0
output:
0.16666667 0.83333333 0.16666667
result:
ok 3 numbers
Test #2:
score: 0
Accepted
time: 110ms
memory: 3592kb
input:
-3 -4 2 -5 -5 4 0 0 3 3 4 2 1 5 2 -4 0 0 5 -5 0 -2 -1 3 5 4 2 3 -5 -1 0 -2 -1 -4 -4 -3 -4 4 -2 -2 2 -1 2 2 1 4 0 5 -4 1 0 -5 -2 4 -5 2 -4 5 0 1 2 5 1 -1 0 -3 -1 5 -4 -4 2 -2 2 2 -4 1 3 -1 2 4 2 -2 1 3 2 5 2 -2 -3 -5 -1 0 0 5 4 2 2 5 3 -3 -3 -3 5 4 -4 1 2 -3 2 -4 2 -3 -2 -2 2 -2 -1 -4 -5 3 4 -3 -3 -3...
output:
0.00000000 0.00000000 0.00000000 0.00000000 0.70833333 0.00000000 0.00000000 15.35565476 0.00000000 6.56250000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 1.31944444 0.00000000 0.52674897 4.65000000 0.00000000 0.00000000 0....
result:
ok 100000 numbers
Test #3:
score: 0
Accepted
time: 118ms
memory: 3596kb
input:
-2 -2 -9 1 7 6 -3 -1 -4 -5 -6 2 -3 -4 -9 -10 -5 -4 0 2 -6 7 -9 2 6 4 5 -2 -6 0 8 -8 -3 -3 -10 2 10 -3 -8 -7 -5 -10 -9 -5 1 10 8 -1 7 9 10 6 3 9 -10 -10 -4 0 2 1 -2 4 9 10 5 -4 -6 6 3 7 4 8 6 5 2 3 -7 8 2 3 1 4 -10 7 -7 -3 -6 -10 5 -9 0 3 1 -5 -6 8 5 -3 8 -8 -8 -4 5 -10 4 0 3 1 9 -9 0 -8 8 -3 -7 9 -2...
output:
0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 16.25573225 0.16666667 0.00000000 26.20192308 1.44989107 0.00000000 0.00000000 0.00000000 0.00000000 1.28027682 0.00000000 0.00000000 0.00000000 13.43124041 0.00000000 0.00000000 0.00000000 0.04545455 0.00000000 18.29333333 0.00000000 58.0408163...
result:
ok 100000 numbers
Test #4:
score: 0
Accepted
time: 120ms
memory: 3664kb
input:
91 49 27 -66 89 -21 -22 35 78 -64 41 -19 93 87 -92 72 -32 -67 -48 28 -6 -50 20 78 -33 90 41 75 -51 43 89 9 -89 -35 -73 88 13 13 82 82 -40 72 -21 -75 36 15 79 -66 -21 -99 -49 -33 60 78 -27 -86 -64 61 66 96 -77 37 -71 72 -35 -9 38 86 -68 51 65 15 -16 -64 -25 -72 23 81 -20 60 60 -52 -99 19 24 83 27 -11...
output:
0.00000000 0.00000000 391.12720688 0.00000000 28313.21226415 0.00000000 11477.66256421 4368.00667701 14406.48359060 5814.42720107 0.00000000 50112.71688980 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 38.15140706 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 ...
result:
ok 100000 numbers
Test #5:
score: 0
Accepted
time: 149ms
memory: 3548kb
input:
-67 241 62 -271 -19 -199 364 487 343 293 433 -343 346 -321 78 -119 68 -487 -319 -45 -165 465 142 491 -310 476 -388 419 409 -124 167 -448 362 233 341 -119 9 -422 290 202 321 -217 310 216 286 172 10 -220 77 107 -282 352 -438 -26 171 81 111 -192 70 -132 376 -361 246 -371 354 -77 -400 -224 457 118 -387 ...
output:
0.00000000 417528.64696572 0.00000000 0.00000000 49064.27449541 5211742.51310033 3370766.24651517 0.00000000 0.00000000 84.40513354 165311.11770843 0.00000000 0.00000000 0.00000000 52736.15256096 0.00000000 132685.48097237 0.00000000 1436397.51531555 0.00000000 0.00000000 0.00000000 0.00000000 0.000...
result:
ok 100000 numbers