test/cpv_local/geo2d/make_c.uva12304.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // competitive-verifier: LOCALCASE test/cpv_local/_data/uva/12304 | ||
| 2 | |||
| 3 | #include "../../../src/geo2d/make_c/rcc_ex/lib.hpp" | ||
| 4 | #include "../../../src/geo2d/make_c/rll/lib.hpp" | ||
| 5 | #include "../../../src/geo2d/make_c/rpl/lib.hpp" | ||
| 6 | #include "../../../src/geo2d/tan/cp/lib.hpp" | ||
| 7 | #include "../../../src/geo2d/tcenter/i/lib.hpp" | ||
| 8 | #include "../../../src/geo2d/tcenter/o/lib.hpp" | ||
| 9 | |||
| 10 | using namespace tifa_libs; | ||
| 11 | using std::cin, std::cout; | ||
| 12 | using data_t = f64; | ||
| 13 | using Point2 = point<data_t>; | ||
| 14 | using Line2 = line<data_t>; | ||
| 15 | using Triangle = triangle<data_t>; | ||
| 16 | using Circle2 = circle<data_t>; | ||
| 17 | |||
| 18 | CEXP data_t PI = pi_v<data_t>; | ||
| 19 | |||
| 20 | 2 | int main() { | |
| 21 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | cout << std::fixed << std::setprecision(6); |
| 22 | |||
| 23 | 2 | strn s; | |
| 24 |
4/6✓ Branch 1 taken 614 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 614 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 612 times.
✓ Branch 7 taken 2 times.
|
614 | while (cin >> s) { |
| 25 |
3/4✓ Branch 1 taken 612 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 101 times.
✓ Branch 4 taken 511 times.
|
612 | if (s == "CircumscribedCircle") { |
| 26 | Triangle t; | ||
| 27 | 101 | cin >> t; | |
| 28 | 101 | Point2 o = center_O(t); | |
| 29 | 101 | data_t r = radius_O(t); | |
| 30 |
7/14✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 101 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 101 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 101 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 101 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 101 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 101 times.
✗ Branch 20 not taken.
|
101 | cout << '(' << o.x << ',' << o.y << ',' << r << ")\n"; |
| 31 |
3/4✓ Branch 1 taken 511 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 101 times.
✓ Branch 4 taken 410 times.
|
511 | } else if (s == "InscribedCircle") { |
| 32 | Triangle t; | ||
| 33 | 101 | cin >> t; | |
| 34 | 101 | Point2 i = center_I(t); | |
| 35 | 101 | data_t r = radius_I(t); | |
| 36 |
7/14✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 101 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 101 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 101 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 101 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 101 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 101 times.
✗ Branch 20 not taken.
|
101 | cout << '(' << i.x << ',' << i.y << ',' << r << ")\n"; |
| 37 |
3/4✓ Branch 1 taken 410 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 103 times.
✓ Branch 4 taken 307 times.
|
410 | } else if (s == "TangentLineThroughPoint") { |
| 38 | Circle2 c; | ||
| 39 | Point2 p; | ||
| 40 | 103 | cin >> c >> p; | |
| 41 | 103 | auto tps = tan_CP(c, p); | |
| 42 |
2/2✓ Branch 1 taken 23 times.
✓ Branch 2 taken 80 times.
|
103 | if (!tps) { |
| 43 |
1/2✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
|
23 | cout << "[]\n"; |
| 44 | } else { | ||
| 45 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | auto [tps0, tps1] = tps.value(); |
| 46 | 80 | Point2 d1 = Line2{p, tps0}.direction(), d2 = Line2{p, tps1}.direction(); | |
| 47 | 80 | data_t angle1 = atan2(d1.y, d1.x) / PI * 180; | |
| 48 | 80 | data_t angle2 = atan2(d2.y, d2.x) / PI * 180; | |
| 49 |
2/2✓ Branch 0 taken 41 times.
✓ Branch 1 taken 39 times.
|
80 | if (angle1 < 0) angle1 += 180; |
| 50 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 80 times.
|
80 | if (angle1 >= 180) angle1 -= 180; |
| 51 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 40 times.
|
80 | if (angle2 < 0) angle2 += 180; |
| 52 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 80 times.
|
80 | if (angle2 >= 180) angle2 -= 180; |
| 53 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 2 taken 79 times.
|
80 | if (is_eq(angle1, angle2)) { |
| 54 |
3/6✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
|
1 | cout << '[' << angle1 << "]\n"; |
| 55 | } else { | ||
| 56 |
2/2✓ Branch 0 taken 58 times.
✓ Branch 1 taken 21 times.
|
79 | if (angle1 > angle2) std::swap(angle1, angle2); |
| 57 |
5/10✓ Branch 1 taken 79 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 79 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 79 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 79 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 79 times.
✗ Branch 14 not taken.
|
79 | cout << '[' << angle1 << ',' << angle2 << "]\n"; |
| 58 | } | ||
| 59 | } | ||
| 60 |
3/4✓ Branch 1 taken 307 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 104 times.
✓ Branch 4 taken 203 times.
|
307 | } else if (s == "CircleThroughAPointAndTangentToALineWithRadius") { |
| 61 | Point2 p; | ||
| 62 | Line2 l; | ||
| 63 | data_t r; | ||
| 64 |
1/2✓ Branch 3 taken 104 times.
✗ Branch 4 not taken.
|
104 | cin >> p >> l >> r; |
| 65 | 104 | auto cs = make_C_rPL(r, p, l); | |
| 66 |
2/2✓ Branch 1 taken 25 times.
✓ Branch 2 taken 79 times.
|
104 | if (!cs) { |
| 67 |
1/2✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
|
25 | cout << "[]\n"; |
| 68 | } else { | ||
| 69 |
1/2✓ Branch 1 taken 79 times.
✗ Branch 2 not taken.
|
79 | auto [cs0, cs1] = cs.value(); |
| 70 |
2/2✓ Branch 1 taken 41 times.
✓ Branch 2 taken 38 times.
|
79 | if (cs1.o < cs0.o) std::swap(cs0, cs1); |
| 71 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 2 taken 78 times.
|
79 | if (cs0.o == cs1.o) { |
| 72 |
5/10✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
|
1 | cout << "[(" << cs0.o.x << ',' << cs0.o.y << ")]\n"; |
| 73 | } else { | ||
| 74 |
9/18✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 26 not taken.
|
78 | cout << "[(" << cs0.o.x << ',' << cs0.o.y << "),(" << cs1.o.x << ',' << cs1.o.y << ")]\n"; |
| 75 | } | ||
| 76 | } | ||
| 77 |
3/4✓ Branch 1 taken 203 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 101 times.
✓ Branch 4 taken 102 times.
|
203 | } else if (s == "CircleTangentToTwoLinesWithRadius") { |
| 78 | Line2 l1, l2; | ||
| 79 | data_t r; | ||
| 80 |
1/2✓ Branch 3 taken 101 times.
✗ Branch 4 not taken.
|
101 | cin >> l1 >> l2 >> r; |
| 81 | 101 | auto cs_ = make_C_rLL(r, l1, l2); | |
| 82 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 101 times.
|
101 | if (!cs_) { |
| 83 | ✗ | cout << "[]\n"; | |
| 84 | } else { | ||
| 85 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
101 | auto [cs0, cs1, cs2, cs3] = cs_.value(); |
| 86 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
202 | vec<Circle2> cs{cs0, cs1, cs2, cs3}; |
| 87 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
708 | std::ranges::sort(cs, [](Circle2 CR lhs, Circle2 CR rhs) { return lhs.o < rhs.o; }); |
| 88 |
17/34✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 101 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 101 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 101 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 101 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 101 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 101 times.
✗ Branch 23 not taken.
✓ Branch 26 taken 101 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 101 times.
✗ Branch 30 not taken.
✓ Branch 33 taken 101 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 101 times.
✗ Branch 37 not taken.
✓ Branch 40 taken 101 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 101 times.
✗ Branch 44 not taken.
✓ Branch 47 taken 101 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 101 times.
✗ Branch 51 not taken.
✓ Branch 54 taken 101 times.
✗ Branch 55 not taken.
✓ Branch 57 taken 101 times.
✗ Branch 58 not taken.
|
101 | cout << "[(" << cs[0].o.x << ',' << cs[0].o.y << "),(" << cs[1].o.x << ',' << cs[1].o.y << "),(" << cs[2].o.x << ',' << cs[2].o.y << "),(" << cs[3].o.x << ',' << cs[3].o.y << ")]\n"; |
| 89 | 101 | } | |
| 90 |
2/4✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 102 times.
✗ Branch 4 not taken.
|
102 | } else if (s == "CircleTangentToTwoDisjointCirclesWithRadius") { |
| 91 | Circle2 c1, c2; | ||
| 92 | data_t r; | ||
| 93 |
1/2✓ Branch 3 taken 102 times.
✗ Branch 4 not taken.
|
102 | cin >> c1 >> c2 >> r; |
| 94 | 102 | auto cs = make_C_rCC_ex(r, c1, c2); | |
| 95 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 78 times.
|
102 | if (!cs) { |
| 96 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | cout << "[]\n"; |
| 97 | } else { | ||
| 98 |
1/2✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
|
78 | auto [cs0, cs1] = cs.value(); |
| 99 |
2/2✓ Branch 1 taken 31 times.
✓ Branch 2 taken 47 times.
|
78 | if (cs1.o < cs0.o) std::swap(cs0, cs1); |
| 100 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 2 taken 77 times.
|
78 | if (cs0.o == cs1.o) { |
| 101 |
5/10✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
|
1 | cout << "[(" << cs0.o.x << ',' << cs0.o.y << ")]\n"; |
| 102 | } else { | ||
| 103 |
9/18✓ Branch 1 taken 77 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 77 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 77 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 77 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 77 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 77 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 77 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 77 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 77 times.
✗ Branch 26 not taken.
|
77 | cout << "[(" << cs0.o.x << ',' << cs0.o.y << "),(" << cs1.o.x << ',' << cs1.o.y << ")]\n"; |
| 104 | } | ||
| 105 | } | ||
| 106 | } | ||
| 107 | } | ||
| 108 | 2 | } | |
| 109 |