Advertisement
Stepavly

Untitled

Jul 18th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #pragma GCC target("tune=native")
  3. #pragma GCC optimize("fast-math,unroll-loops")
  4.  
  5. #include <math.h>
  6. #include <algorithm>
  7. #include <set>
  8. #include <iostream>
  9. #include <vector>
  10. #include <queue>
  11. #include <map>
  12. #include <string>
  13. #include <time.h>
  14. #include <cassert>
  15. #include <functional>
  16. #include <memory.h>
  17. #include <stack>
  18. #include <bitset>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <random>
  22. #include <chrono>
  23. #include <complex>
  24. #include <fstream>
  25. #include <climits>
  26. using namespace std;
  27.  
  28. typedef unsigned long long ull;
  29. typedef long long ll;
  30. typedef unsigned u;
  31. typedef long double ld;
  32. typedef vector<vector<int>> vvi;
  33. typedef unsigned char uc;
  34. typedef unsigned short us;
  35. typedef complex<double> cd;
  36.  
  37. #define INF 1000000000
  38. #define LLINF 1000000000000000000LL
  39. #define EPS 1e-9l
  40. #define pii pair<int, int>
  41.  
  42. const int DEBUG = 0;
  43.  
  44. #ifdef LOCAL
  45. mt19937 gen(228);
  46. #else
  47. mt19937 gen((u)chrono::high_resolution_clock::now().time_since_epoch().count());
  48. #endif
  49.  
  50. #pragma comment(linker, "/STACK:76777216")
  51.  
  52. struct pt
  53. {
  54. double x, y, z;
  55. };
  56.  
  57. double sqr(double x)
  58. {
  59. return x * x;
  60. }
  61.  
  62. double dist(const pt& a, const pt& b)
  63. {
  64. return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z));
  65. }
  66.  
  67. pt pts[3];
  68.  
  69. double calcDist(pt p)
  70. {
  71. double res = 0;
  72.  
  73. for (int i = 0; i < 3; i++)
  74. res += dist(p, pts[i]);
  75.  
  76. return res;
  77. }
  78.  
  79. double calcZ(double x, double y, double& z)
  80. {
  81. double l = -1e9, r = 1e9;
  82.  
  83. while (r - l > 1e-5)
  84. {
  85. double m1 = l + (r - l) / 3;
  86. double m2 = r - (r - l) / 3;
  87.  
  88. if (calcDist(pt{ x, y, m1 }) < calcDist(pt{ x, y, m2 }))
  89. r = m2;
  90. else
  91. l = m1;
  92. }
  93.  
  94. l = (l + r) / 2;
  95. z = l;
  96.  
  97. return calcDist(pt{ x, y, z });
  98. }
  99.  
  100. double calcY(double x, double& y, double& z)
  101. {
  102. double l = -1e9, r = 1e9;
  103.  
  104. while (r - l > 1e-5)
  105. {
  106. double m1 = l + (r - l) / 3;
  107. double m2 = r - (r - l) / 3;
  108.  
  109. if (calcZ(x, m1, z) < calcZ(x, m2, z))
  110. r = m2;
  111. else
  112. l = m1;
  113. }
  114.  
  115. l = (l + r) / 2;
  116. y = l;
  117.  
  118. return calcZ(x, y, z);
  119. }
  120.  
  121. double calcX(double& x, double& y, double& z)
  122. {
  123. double l = -1e9, r = 1e9;
  124.  
  125. while (r - l > 1e-5)
  126. {
  127. double m1 = l + (r - l) / 3;
  128. double m2 = r - (r - l) / 3;
  129.  
  130. if (calcY(m1, y, z) < calcY(m2, y, z))
  131. r = m2;
  132. else
  133. l = m1;
  134. }
  135.  
  136. l = (l + r) / 2;
  137. x = l;
  138.  
  139. return calcY(x, y, z);
  140. }
  141.  
  142. int main()
  143. {
  144. ios_base::sync_with_stdio(0);
  145. cin.tie(0);
  146. cout.setf(cout.fixed);
  147. cout.precision(12);
  148. auto START_TIME = chrono::high_resolution_clock::now();
  149.  
  150. for (int i = 0; i < 3; i++)
  151. {
  152. cin >> pts[i].x >> pts[i].y >> pts[i].z;
  153. }
  154.  
  155. double x, y, z;
  156.  
  157. cout << calcX(x, y, z);
  158.  
  159. #ifdef LOCAL
  160. cerr.precision(3);
  161. cerr << "\nWorking time: " << chrono::duration<double>(chrono::high_resolution_clock::now() - START_TIME).count() << " sec.";
  162. #endif
  163.  
  164. return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement