QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#655313 | #9227. Henry the Plumber | real_sigma_team | WA | 1ms | 4256kb | C++23 | 3.2kb | 2024-10-19 02:49:15 | 2024-10-19 02:49:15 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
constexpr int K = 3;
constexpr double PI = acos(-1);
using vec = std::array<double, K>;
using line = std::array<double, 3>;
vec operator+(const vec& a, const vec& b) {
vec c;
for (int i = 0; i < K; i++) {
c[i] = a[i] + b[i];
}
return c;
}
vec operator-(const vec& a, const vec& b) {
vec c;
for (int i = 0; i < K; i++) {
c[i] = a[i] - b[i];
}
return c;
}
double operator*(const vec& a, const vec& b) {
double res = 0;
for (int i = 0; i < K; i++) {
res += a[i] * b[i];
}
return res;
}
double len(const vec& a) {
return sqrt(a * a);
}
double angle(const vec& a, const vec& b) {
vec c = a - b;
return acos((a * a + b * b - c * c) / (2.0 * len(a) * len(b)));
}
line lin(const vec& norm, const vec& point) {
line res;
res[0] = norm[0] / len(norm);
res[1] = norm[1] / len(norm);
if (res[0] < 0 || (res[0] == 0 && res[1] < 0)) {
res[0] *= -1;
res[1] *= -1;
}
res[2] = -(res[0] * point[0] + res[1] * point[1]);
return res;
}
bool operator==(const line& a, const line& b) {
bool res = true;
for (int i = 0; i < 3; i++) {
res &= a[i] == b[i];
}
return res;
}
bool colinear(const line& a, const line& b) {
bool res = true;
for (int i = 0; i < 2; i++) {
res &= a[i] == b[i];
}
return res;
}
vec inter(line a, line b) {
vec res;
res[2] = 0;
if (b[0] == 0) {
swap(a, b);
}
if (a[0] != 0) {
double coef = a[0] / b[0];
for (int i = 0; i < K; i++) {
a[i] -= b[i] * coef;
}
}
res[1] = -a[2] / a[1];
res[0] = -(res[1] * b[1] + b[2]) / b[0];
return res;
}
void solve() {
vec norm1, point1, norm2, point2;
cin >> point1[0] >> point1[1] >> point1[2] >> norm1[0] >> norm1[1];
cin >> point2[0] >> point2[1] >> point2[2] >> norm2[0] >> norm2[1];
norm1[2] = 0;
norm2[2] = 0;
line l1 = lin(norm1, point1);
line l2 = lin(norm2, point2);
if (l1 == l2) {
cout << "2\n";
return;
}
if (colinear(l1, l2)) {
cout << "4\n";
return;
}
vec point = inter(l1, l2);
point[2] = point1[2];
if (point == point1) {
cout << "3\n";
return;
}
point[2] = point2[2];
if (point == point2) {
cout << "3\n";
return;
}
double l = -10000, r = 10000;
while (r - l > 1e-10) {
double m1 = (2 * l + r) / 3;
double m2 = (l + 2 * r) / 3;
point[2] = m1;
double a1 = angle(point1 - point, point2 - point);
point[2] = m2;
double a2 = angle(point1 - point, point2 - point);
if (a1 > a2) {
r = m2;
} else {
l = m1;
}
}
point[2] = l;
double a = angle(point1 - point, point2 - point);
if (a >= PI / 2 - 1e-7) {
cout << "3\n";
return;
}
cout << "4\n";
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(30);
int t;
cin >> t;
while (t--) {
solve();
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3724kb
input:
2 -1 -1 3 1 1 2 2 3 2 2 5 5 1 3 0 7 6 -2 1 -2
output:
4 3
result:
ok 2 number(s): "4 3"
Test #2:
score: 0
Accepted
time: 1ms
memory: 4256kb
input:
100 -13 -5 -7 -19 19 -19 -13 0 -7 15 -20 20 19 -17 18 20 -20 -1 18 -19 -18 15 -14 -19 18 19 -20 6 20 -19 -12 9 1 7 -16 -13 -14 -8 8 -13 -19 16 9 20 -19 19 -18 -11 19 -18 19 20 -8 12 20 -11 -9 18 -19 -18 8 11 -13 12 -18 18 13 8 4 -18 -16 20 17 -19 18 20 -18 -3 20 -19 -17 -20 -5 -18 -19 19 16 15 19 20...
output:
4 4 4 4 4 4 3 4 4 4 3 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 3 4 3 4 4 4 3 4 4 4 4 4 4 4 3 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4
result:
ok 100 numbers
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 4096kb
input:
100 20 -9 -19 9 13 -12 14 -18 -17 12 2 -3 -2 2 -19 -8 9 -15 -19 3 -16 -16 -18 2 15 19 17 -6 -10 11 14 -20 -6 -19 7 -17 -8 -1 -7 -15 7 -15 3 2 13 -15 -9 11 15 2 -17 20 13 11 -8 -12 18 16 -18 -17 -17 15 -2 -20 1 8 -6 0 -16 -19 -5 -14 16 -17 10 -7 -16 17 -10 -13 1 1 -13 17 11 -3 -3 -18 4 -17 19 -6 -17 ...
output:
3 4 4 4 3 3 4 3 3 3 4 3 4 4 3 3 4 3 3 4 4 4 3 4 3 4 4 3 3 3 4 3 3 4 3 3 3 3 3 4 3 3 3 4 3 4 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 4 4 3 4 3 3 4 3 3 3 3 3 3 3 3 3 4 3 4 3 3 3 4 3 4 3 3 3 3 3 3 3 4 3 3 4 4 4 4
result:
wrong answer 10th numbers differ - expected: '4', found: '3'