#include #include #include using namespace std; int signum(int n) { if (0 < n) return 1; if (n < 0) return -1; return 0; } struct Pos { int x, y; Pos add(Pos other) { return Pos{this->x+other.x,this->y+other.y}; } Pos sub(Pos other) { return Pos{this->x-other.x,this->y-other.y}; } bool touching(Pos other) { return abs(this->x - other.x) <= 1 && abs(this->y - other.y) <= 1; } Pos moveTowards(Pos other) { Pos p = *this; if (!touching(other)) { p.x += signum(other.x - this->x); p.y += signum(other.y - this->y); } return p; } bool operator==(Pos const& p) const noexcept { return x == p.x && y == p.y; } }; template<> struct std::hash { size_t operator()(Pos const& p) const noexcept { return std::hash{}(p.x) ^ (std::hash{}(p.x) << 1); } }; int main() { char dir; int steps; Pos bridge[10] = {0}; unordered_set visited1; unordered_set visited2; while (scanf("%c %d ", &dir, &steps) == 2) { Pos d; switch (dir) { case 'R': d = {1, 0}; break; case 'L': d = {-1, 0}; break; case 'U': d = {0, -1}; break; case 'D': d = {0, 1}; break; default: throw "bad input"; } for (int i = 0; i < steps; i++) { bridge[0] = bridge[0].add(d); for (int j = 1; j < 10; j++) { bridge[j] = bridge[j].moveTowards(bridge[j-1]); } visited1.insert(bridge[1]); visited2.insert(bridge[9]); } } cout << visited1.size() << endl; cout << visited2.size() << endl; }