Advertisement
Guest User

Untitled

a guest
Dec 24th, 2023
2,285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <vector>
  5. #include <array>
  6. #include <algorithm>
  7. #include <utility>
  8. #include <map>
  9. #include <queue>
  10. #include <set>
  11. #include <cmath>
  12. #include <cstdio>
  13. #include <cstring>
  14. #include <functional>
  15. #include <numeric>
  16. #include <unordered_set>
  17. #include <cassert>
  18. #include <sstream>
  19. #include <queue>
  20. #include <bitset>
  21. #include <Eigen/Core>
  22. #include <Eigen/Dense>
  23.  
  24. Eigen::Matrix3d crossMatrix(Eigen::Vector3d v)
  25. {
  26.     Eigen::Matrix3d result;
  27.     result << 0, -v[2], v[1],
  28.         v[2], 0, -v[0],
  29.         -v[1], v[0], 0;
  30.     return result;
  31. }
  32.  
  33. int main()
  34. {
  35.     struct Hailstone
  36.     {
  37.         Eigen::Vector3d p;
  38.         Eigen::Vector3d v;
  39.     };
  40.  
  41.     std::vector<Hailstone> hailstones;
  42.     while (true)
  43.     {
  44.         Hailstone h;
  45.         char dummy;
  46.         std::cin >> h.p[0] >> dummy >> h.p[1] >> dummy >> h.p[2] >> dummy >> h.v[0] >> dummy >> h.v[1] >> dummy >> h.v[2];
  47.  
  48.         if (!std::cin)
  49.             break;
  50.         hailstones.push_back(h);
  51.     }
  52.  
  53.     Eigen::MatrixXd M(6, 6);
  54.     Eigen::VectorXd rhs(6);
  55.     rhs.segment<3>(0) = -hailstones[0].p.cross(hailstones[0].v) + hailstones[1].p.cross(hailstones[1].v);
  56.     rhs.segment<3>(3) = -hailstones[0].p.cross(hailstones[0].v) + hailstones[2].p.cross(hailstones[2].v);
  57.     M.block<3, 3>(0, 0) = crossMatrix(hailstones[0].v) - crossMatrix(hailstones[1].v);
  58.     M.block<3, 3>(3, 0) = crossMatrix(hailstones[0].v) - crossMatrix(hailstones[2].v);
  59.     M.block<3, 3>(0, 3) = -crossMatrix(hailstones[0].p) + crossMatrix(hailstones[1].p);
  60.     M.block<3, 3>(3, 3) = -crossMatrix(hailstones[0].p) + crossMatrix(hailstones[2].p);
  61.     Eigen::Vector3d result = M.inverse() * rhs;
  62.     std::cout << "pos: " << result.segment<3>(0) << " vel: " << result.segment<3>(3) << std::endl;
  63.     int64_t sum = 0;
  64.     for (int i = 0; i < 3; i++)
  65.         sum += int64_t(result[i]);
  66.     std::cout << sum << std::endl;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement