Task: | Ruudukko |
Sender: | Mahtimursu |
Submission time: | 2023-04-25 16:55:53 +0300 |
Language: | C++ (C++17) |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 5 |
#2 | ACCEPTED | 12 |
#3 | ACCEPTED | 27 |
#4 | ACCEPTED | 28 |
#5 | ACCEPTED | 28 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.00 s | 1, 5 | details |
#2 | ACCEPTED | 0.00 s | 2, 5 | details |
#3 | ACCEPTED | 0.00 s | 3, 5 | details |
#4 | ACCEPTED | 0.00 s | 4, 5 | details |
#5 | ACCEPTED | 0.01 s | 5 | details |
#6 | ACCEPTED | 0.01 s | 5 | details |
#7 | ACCEPTED | 0.00 s | 2, 5 | details |
#8 | ACCEPTED | 0.00 s | 2, 5 | details |
#9 | ACCEPTED | 0.00 s | 3, 5 | details |
#10 | ACCEPTED | 0.00 s | 3, 5 | details |
#11 | ACCEPTED | 0.00 s | 3, 5 | details |
#12 | ACCEPTED | 0.00 s | 3, 5 | details |
#13 | ACCEPTED | 0.00 s | 4, 5 | details |
#14 | ACCEPTED | 0.01 s | 5 | details |
#15 | ACCEPTED | 0.00 s | 3, 5 | details |
#16 | ACCEPTED | 0.01 s | 5 | details |
Code
#include <iostream> #include <random> #include <iomanip> #include <cstring> #include <chrono> #include <algorithm> #include <cassert> constexpr int MAX_SIZE {60 + 2}; struct input_t { int n, m, y1, x1, y2, x2; int gy {}, gx {}; const std::string print() const { std::ostringstream oss; oss << "[gy: " << gy << ", gx: " << gx << "], " << n << " " << m << " " << y1 << " " << x1 << " " << y2 << " " << x2; return oss.str(); } void validate_input() const { assert(n >= 1 && m >= 1); assert(n <= 50 && m <= 50); assert(y1 >= 1 && y2 >= 1); assert(x1 >= 1 && x2 >= 1); assert(y1 <= n && y2 <= n); assert(x1 <= m && x2 <= m); assert(y1 != y2 || x1 != x2); }; bool is_solvable() const { bool v1_even {((y1 + x1) & 1) == 0}; bool v2_even {((y2 + x2) & 1) == 0}; bool invalid {false // one row or one column || (n == 1 && (std::min(x1, x2) > 1 || std::max(x1, x2) < m)) || (m == 1 && (std::min(y1, y2) > 1 || std::max(y1, y2) < n)) // black and white start/end // for 'odd' graphs only this one condition || (((m * n) & 1) == 1 && (!v1_even || !v2_even)) // for 'even' graphs: || (((m * n) & 1) == 0 && n > 1 && m > 1 && ((v1_even == v2_even) // size 2 || (n == 2 && m > 2 && x1 == x2 && x1 != 1 && x1 != m) || (m == 2 && n > 2 && y1 == y2 && y1 != 1 && y1 != n) // 3 x even, even x 3 || (n == 3 && (m & 1) == 0 && ((!v1_even && (x1 < x2 - (y1 != 2))) || (v1_even && (x1 > x2 + (y1 != 2))))) || (m == 3 && (n & 1) == 0 && ((!v1_even && (y1 < y2 - (x1 != 2))) || (v1_even && (y1 > y2 + (x1 != 2))))) )) }; return !invalid; }; bool is_trivial() const { int miny {std::min(y1, y2)}, maxy {std::max(y1, y2)}; int minx {std::min(x1, x2)}, maxx {std::max(x1, x2)}; return {false // opposite corners || (((n & 1) == 1 || (m & 1) == 1) && miny == 1 && maxy == n && minx == 1 && maxx == m) // corners on same face || ((n & 1) == 0 && miny == 1 && maxy == n && (maxx == 1 || minx == m)) || ((m & 1) == 0 && minx == 1 && maxx == m && (maxy == 1 || miny == n)) }; }; void validate_solution(const std::string& path) const { int y {y1}, x {x1}; validate_input(); assert(path.size() == std::size_t(n * m - 1)); char grid[MAX_SIZE][MAX_SIZE]; std::memset(grid, 0, sizeof(grid)); for (char d : path) { assert(y >= 1 && x >= 1); assert(y <= n && x <= m); assert(grid[y][x] == 0); grid[y][x] = 1; assert(d == 'R' || d == 'D' || d == 'L' || d == 'U'); y += (d == 'D') - (d == 'U'); x += (d == 'R') - (d == 'L'); } assert(y == y2 && x == x2); } }; struct brute_force_solver { char grid[MAX_SIZE][MAX_SIZE]; const std::string operator () (const input_t& i) { std::memset(grid, 0, sizeof(grid)); for (int y {}; y <= i.n + 1; y++) { grid[y][0] = grid[y][i.m + 1] = 1; } for (int x {1}; x <= i.m; x++) { grid[0][x] = grid[i.n + 1][x] = 1; } std::string path; path.reserve(i.n * i.m); auto search {[&](auto search, char d, int y, int x) { if (grid[y][x]) { return false; } if (y > 1 && x > 1 && y < i.n && x < i.m && (grid[y - 1][x] == grid[y + 1][x] && grid[y][x - 1] == grid[y][x + 1] && grid[y - 1][x] != grid[y][x - 1]) ) { return false; } if (d != 0) { path.push_back(d); } bool found {}; if (y == i.y2 && x == i.x2) { found = (path.size() == std::size_t(i.n * i.m - 1)); } else { grid[y][x] = 1; found = (false || (x < i.m && search(search, 'R', y, x + 1)) || (y < i.n && search(search, 'D', y + 1, x)) || (x > 1 && search(search, 'L', y, x - 1)) || (y > 1 && search(search, 'U', y - 1, x)) ); grid[y][x] = 0; } if (!found && d != 0) { path.pop_back(); } return found; }}; search(search, 0, i.y1, i.x1); if (!path.empty()) { i.validate_solution(path); } return path; } }; struct solver_base { char grid[MAX_SIZE][MAX_SIZE]; std::string indent; void solve_trivial_path(const input_t& i) { static char dir[] {"ULDR"}; bool cols_first {((i.n & 1) == 0 && i.x1 != i.x2) || i.y1 == i.y2}; bool rows_first {!cols_first}; auto [n, m, y1, x1, y2, x2, gy, gx] {i}; if (!rows_first) { std::swap(n, m); std::swap(y1, x1); std::swap(y2, x2); } int y {y1}, x {x1}; int dy {(y2 > 1) - (y2 == 1)}; int dx {(x2 > 1) - (x2 == 1)}; if ((n & 1) == 0) { dx *= -1; }; (rows_first ? gy : gx) += y; (rows_first ? gx : gy) += x; while (true) { for (int c {}; c < m - 1; c++) { assert(y > 0 && y <= n && x > 0 && x <= m); grid[gy][gx] = dir[1 + rows_first + dx]; x += dx; (rows_first ? gx : gy) += dx; } if (y == y2) { break; } assert(y > 0 && y <= n && x > 0 && x <= m); grid[gy][gx] = dir[2 - rows_first + dy]; y += dy; (rows_first ? gy : gx) += dy; dx *= -1; } assert(y == y2 && x == x2); grid[gy][gx] = 'e'; } void print_subgrid(const input_t& i) { // print grid / sub-grid std::cout << indent << std::string(i.m + 2, '_') << std::endl; for (int y {1}; y <= i.n; y++) { std::cout << indent << std::quoted(std::string(grid[i.gy + y] + i.gx + 1, grid[i.gy + y] + i.gx + 1 + i.m), '_') << std::endl; } std::cout << indent << std::string(i.m + 2, '_') << std::endl; std::cout << std::endl; } const std::string path_from_grid(const input_t& i) const { std::string path; path.reserve(i.n * i.m); int y {i.y1}; int x {i.x1}; for (int c {}; c < i.n * i.m - 1; c++) { const char d {grid[i.gy + y][i.gx + x]}; path.push_back(d); y += (d == 'D') - (d == 'U'); x += (d == 'R') - (d == 'L'); } return path; } virtual const bool solve(const input_t&) = 0; const std::string operator () (const input_t& i) { std::memset(grid, 0, sizeof(grid)); for (int y {}; y <= i.n + 1; y++) { std::memset(grid[y], '_', i.m + 2); } auto solved {solve(i)}; // std::cout << "solver: " << i.print() << " (solved: " << solved << ")" << std::endl; if (solved) { // print_subgrid(i); auto path {path_from_grid(i)}; i.validate_solution(path); return path; } return {}; } }; struct solver : solver_base { bool solve_rec(const input_t& i) { bool is_solvable {i.is_solvable()}, is_trivial {i.is_trivial()}; assert(!is_trivial || is_solvable); // std::cout << indent << "solve_rec: " << i.print() << " (is_solvable: " << is_solvable << ", is_trivial: " << is_trivial << ")" << std::endl; i.validate_input(); if (!is_solvable) { return false; } auto& [n, m, y1, x1, y2, x2, gy, gx] {i}; indent.push_back('\t'); auto ret_true {[&]() { indent.pop_back(); // std::cout << indent << "solved : " << i.print() << " (is_solvable: " << is_solvable << ", is_trivial: " << is_trivial << ")" << std::endl; // print_subgrid(i); // auto path {path_from_grid(i)}; // i.validate_solution(path); return true; }}; if (is_trivial) { solve_trivial_path(i); return ret_true(); } auto grid_get {[this, &i](int y, int x) { return grid[i.gy + y][i.gx + x]; }}; auto grid_set {[this, &i](int y, int x, char v) { grid[i.gy + y][i.gx + x] = v; }}; int minx {std::min(x1, x2)}, maxx {std::max(x1, x2)}; for (int ex {2}; ex < minx; ex++) { if (solve_rec({n, m - ex, y1, x1 - ex, y2, x2 - ex, gy, gx + ex})) { for (int y {1}; y < n; y++) { bool dn {grid_get(y, ex + 1) == 'D'}; if (dn || grid_get(y + 1, ex + 1) == 'U') { bool stripped {solve_rec({n, ex, y + 1 - dn, ex, y + dn, ex, gy, gx})}; assert(stripped); grid_set(y + 1 - dn, ex + 1, 'L'); grid_set(y + dn, ex, 'R'); return ret_true(); } } assert(false); } } for (int ex {maxx}; ex < m - 1; ex++) { if (solve_rec({n, ex, y1, x1, y2, x2, gy, gx})) { for (int y {1}; y < n; y++) { bool dn {grid_get(y, ex) == 'D'}; if (dn || grid_get(y + 1, ex) == 'U') { bool stripped {solve_rec({n, m - ex, y + 1 - dn, 1, y + dn, 1, gy, gx + ex})}; assert(stripped); grid_set(y + 1 - dn, ex, 'R'); grid_set(y + dn, ex + 1, 'L'); return ret_true(); } } assert(false); } } int miny {std::min(y1, y2)}, maxy {std::max(y1, y2)}; for (int ey {2}; ey < miny; ey++) { if (solve_rec({n - ey, m, y1 - ey, x1, y2 - ey, x2, gy + ey, gx})) { for (int x {1}; x < m; x++) { bool rh {grid_get(ey + 1, x) == 'R'}; if (rh || grid_get(ey + 1, x + 1) == 'L') { bool stripped {solve_rec({ey, m, ey, x + 1 - rh, ey, x + rh, gy, gx})}; assert(stripped); grid_set(ey + 1, x + 1 - rh, 'U'); grid_set(ey, x + rh, 'D'); return ret_true(); } } assert(false); } } for (int ey {maxy}; ey < n - 1; ey++) { if (solve_rec({ey, m, y1, x1, y2, x2, gy, gx})) { for (int x {1}; x < m; x++) { bool rh {grid_get(ey, x) == 'R'}; if (rh || grid_get(ey, x + 1) == 'L') { bool stripped {solve_rec({n - ey, m, 1, x + 1 - rh, 1, x + rh, gy + ey, gx})}; assert(stripped); grid_set(ey, x + 1 - rh, 'D'); grid_set(ey + 1, x + rh, 'U'); return ret_true(); } } assert(false); } } for (int x {x1}; x < x2; x++) { for (int y {1}; y <= n; y++) { if ((y1 != y || x1 != x) && (y != y2 || x + 1 != x2) && input_t {n, m - x, y, 1, y2, x2 - x}.is_solvable() && solve_rec({n, x, y1, x1, y, x, gy, gx}) && solve_rec({n, m - x, y, 1, y2, x2 - x, gy, gx + x}) ) { grid_set(y, x, 'R'); return ret_true(); } } } for (int x {x2}; x < x1; x++) { for (int y {1}; y <= n; y++) { if ((y1 != y || x1 != x + 1) && (y != y2 || x != x2) && input_t {n, x, y, x, y2, x2}.is_solvable() && solve_rec({n, m - x, y1, x1 - x, y, 1, gy, gx + x}) && solve_rec({n, x, y, x, y2, x2, gy, gx}) ) { grid_set(y, x + 1, 'L'); return ret_true(); } } } for (int y {y1}; y < y2; y++) { for (int x {1}; x <= m; x++) { if ((y1 != y || x1 != x) && (y + 1 != y2 || x != x2) && input_t {n - y, m, 1, x, y2 - y, x2}.is_solvable() && solve_rec({y, m, y1, x1, y, x, gy, gx}) && solve_rec({n - y, m, 1, x, y2 - y, x2, gy + y, gx}) ) { grid_set(y, x, 'D'); return ret_true(); } } } for (int y {y2}; y < y1; y++) { for (int x {1}; x <= m; x++) { if ((y1 != y + 1 || x1 != x) && (y != y2 || x != x2) && input_t {y, m, y, x, y2, x2}.is_solvable() && solve_rec({n - y, m, y1 - y, x1, 1, x, gy + y, gx}) && solve_rec({y, m, y, x, y2, x2, gy, gx}) ) { grid_set(y + 1, x, 'U'); return ret_true(); } } } assert(false); } virtual const bool solve(const input_t& i) override final { return solve_rec(i); } }; struct solver_tr : solver_base { struct input_tr_t : input_t { struct { bool transposed {}; bool reflected {}; int tn {}, tm {}; } transformation; const std::string print() const { auto& t {transformation}; std::ostringstream oss; oss << " [gy: " << gy << ", gx: " << gx << "], (tr: " << t.transposed << ", re: " << t.reflected << "): " << n << " " << m << " " << y1 << " " << x1 << " " << y2 << " " << x2; return oss.str(); } void init_transformation() { transformation.tn = n + 1; transformation.tm = m + 1; } void set_transformation(bool transposed, bool reflected) { auto& [tr, re, tn, tm] {transformation}; if (tr != transposed) { std::swap(n, m); std::swap(y1, x1); std::swap(y2, x2); std::swap(gy, gx); std::swap(tn, tm); tr = transposed; } if (re != reflected) { y1 = n + 1 - y1; x1 = m + 1 - x1; y2 = n + 1 - y2; x2 = m + 1 - x2; gy = tn - gy - n - 1; gx = tm - gx - m - 1; re = reflected; } } const std::pair<int, int> transform_yx(int y, int x) const { auto& [tr, re, tn, tm] {transformation}; y = gy + y; x = gx + x; if (re) { y = tn - y; x = tm - x; } if (tr) { std::swap(y, x); } return {y, x}; } const char transform_direction(char v) const { if (v == 'e') { return v; } auto& [tr, re, tn, tm] {transformation}; if (re) { static char from[] {"RDLU"}; static char to [] {"LURD"}; auto it {std::find(std::begin(from), std::end(from), v)}; assert(it != std::end(from)); v = to[it - std::begin(from)]; } if (tr) { static char from[] {"RDLU"}; static char to [] {"DRUL"}; auto it {std::find(std::begin(from), std::end(from), v)}; assert(it != std::end(from)); v = to[it - std::begin(from)]; } return v; } }; bool solve_rec(input_tr_t&& i) { bool is_solvable {i.is_solvable()}, is_trivial {i.is_trivial()}; assert(!is_trivial || is_solvable); // std::cout << indent << "solve_rec: " << i.print() << " (is_solvable: " << is_solvable << ", is_trivial: " << is_trivial << ")" << std::endl; i.validate_input(); if (!is_solvable) { return false; } auto& [n, m, y1, x1, y2, x2, gy, gx] {static_cast<input_t&>(i)}; auto& t {i.transformation}; indent.push_back('\t'); auto ret_true {[&] { indent.pop_back(); // i.set_transformation(false, false); // std::cout << indent << "solved : " << i.print() << " (is_solvable: " << is_solvable << ", is_trivial: " << is_trivial << ")" << std::endl; // print_subgrid(i); // auto path {path_from_grid(i)}; // i.validate_solution(path); return true; }}; if (is_trivial) { i.set_transformation(false, false); solve_trivial_path(i); return ret_true(); } auto grid_get {[this, &i](int y, int x) { auto [y_, x_] {i.transform_yx(y, x)}; return i.transform_direction(grid[y_][x_]); }}; auto grid_set {[this, &i](int y, int x, char v) { auto [y_, x_] {i.transform_yx(y, x)}; grid[y_][x_] = i.transform_direction(v); }}; for (auto& [tr, re] : std::initializer_list<std::pair<bool, bool>> { {t.transposed, t.reflected}, {!t.transposed, t.reflected}, {!t.transposed, !t.reflected}, {t.transposed, !t.reflected} }) { i.set_transformation(tr, re); int minx {std::min(x1, x2)}; for (int ex {2}; ex < minx; ex++) { if (solve_rec({n, m - ex, y1, x1 - ex, y2, x2 - ex, gy, gx + ex, t})) { for (int y {1}; y < n; y++) { bool dn {grid_get(y, ex + 1) == 'D'}; if (dn || grid_get(y + 1, ex + 1) == 'U') { bool stripped {solve_rec({n, ex, y + 1 - dn, ex, y + dn, ex, gy, gx, t})}; assert(stripped); grid_set(y + 1 - dn, ex + 1, 'L'); grid_set(y + dn, ex, 'R'); return ret_true(); } } assert(false); } } for (int x {x1}; x < x2; x++) { for (int y {1}; y <= n; y++) { if ((y1 != y || x1 != x) && (y != y2 || x + 1 != x2) && input_t {n, m - x, y, 1, y2, x2 - x}.is_solvable() && solve_rec({n, x, y1, x1, y, x, gy, gx, t}) && solve_rec({n, m - x, y, 1, y2, x2 - x, gy, gx + x, t}) ) { grid_set(y, x, 'R'); return ret_true(); } } } } assert(false); } virtual const bool solve(const input_t& i_) override final { input_tr_t i {i_}; i.init_transformation(); return solve_rec(std::move(i)); } }; const input_t rand_input(int max_size, int r) { static std::random_device rd; static std::mt19937 re {rd()}; assert(max_size >= 1 && max_size <= 50); std::uniform_int_distribution<int> diff_uniform_dist {0, max_size - 1}; int ydiff {diff_uniform_dist(re)}, xdiff{diff_uniform_dist(re)}; if (ydiff == 0 && xdiff == 0) { ydiff += 1 - (r & 1); xdiff += (r & 1); } input_t i; i.n = std::uniform_int_distribution<int> {ydiff + 1, max_size}(re); i.m = std::uniform_int_distribution<int> {xdiff + 1, max_size}(re); i.y1 = std::uniform_int_distribution<int> {1, i.n - ydiff}(re); i.x1 = std::uniform_int_distribution<int> {1, i.m - xdiff}(re); i.y2 = i.y1 + ydiff; i.x2 = i.x1 + xdiff; if (r & 2) { std::swap(i.y1, i.y2); } if (r & 4) { std::swap(i.x1, i.x2); } i.validate_input(); return i; } void test(int num, int max_size, bool cmp) { auto measure_execution {[](auto& timer, auto callable, auto... args) -> decltype(auto) { auto start {std::chrono::high_resolution_clock::now()}; decltype(auto) ret {callable(std::forward<decltype(args)>(args)...)}; auto finish {std::chrono::high_resolution_clock::now()}; timer += std::chrono::duration_cast<std::remove_reference_t<decltype(timer)>>(finish - start); return ret; }}; std::chrono::nanoseconds s_timer {}, s_tr_timer {}, bf_timer {}; while (num-- > 0) { auto i {rand_input(max_size, num)}; std::cout << "rand: " << i.print() << std::endl; auto s {measure_execution(s_timer, solver(), i)}; std::cout << (s.empty() ? "NO" : "YES\n" + s) << std::endl; auto s_tr {measure_execution(s_tr_timer, solver_tr(), i)}; std::cout << (s_tr.empty() ? "NO" : "YES\n" + s_tr) << std::endl; assert(s.empty() == s_tr.empty()); if (cmp) { auto bf {measure_execution(bf_timer, brute_force_solver(), i)}; std::cout << (bf.empty() ? "NO" : "YES\n" + bf) << std::endl; assert(s.empty() == bf.empty()); } } std::cout << "s_timer: " << s_timer.count() / 1e9 << ", s_tr_timer: " << s_tr_timer.count() / 1e9 << ", bf_timer: " << bf_timer.count() / 1e9 << std::endl << std::endl; } int main(int argc, char* argv[]) { // test(10000, 5, true); // test(10000, 12, false); // test(100000, 50, false); int t; input_t i; std::cin >> t; while (t-- > 0) { std::cin >> i.n >> i.m >> i.y1 >> i.x1 >> i.y2 >> i.x2; // std::cout << "cin: " << i.print() << std::endl; i.validate_input(); auto s {solver()(i)}; std::cout << (s.empty() ? "NO" : "YES\n" + s) << std::endl; } return 0; }
Test details
Test 1
Group: 1, 5
Verdict: ACCEPTED
input |
---|
100 1 45 1 45 1 1 1 18 1 1 1 10 1 47 1 17 1 30 1 33 1 28 1 20 ... |
correct output |
---|
YES LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL... |
user output |
---|
YES LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL... Truncated |
Test 2
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100 2 43 1 33 1 21 2 2 1 1 2 2 2 32 1 1 2 8 2 14 1 12 1 14 ... |
correct output |
---|
NO NO NO NO YES ... |
user output |
---|
NO NO NO NO YES ... Truncated |
Test 3
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 4 2 1 2 4 3 38 2 24 1 22 3 29 2 23 2 3 3 8 3 1 1 2 ... |
correct output |
---|
NO NO NO YES RRRRRRRUULDLULDLULDLLUR ... |
user output |
---|
NO NO NO YES RRRURDRURDRUULLLLLDLLUR ... Truncated |
Test 4
Group: 4, 5
Verdict: ACCEPTED
input |
---|
100 4 25 2 19 1 5 4 13 3 10 4 12 4 7 3 1 4 2 4 23 1 19 2 5 ... |
correct output |
---|
YES DDRRRRRRULLLLLURRRRRULLLLLLLDD... |
user output |
---|
YES RDDRUURDDRUURDDRUUULLLLLLLDLUL... Truncated |
Test 5
Group: 5
Verdict: ACCEPTED
input |
---|
100 16 8 13 1 14 8 41 21 19 11 32 12 46 17 13 7 6 11 8 41 4 32 4 12 ... |
correct output |
---|
NO YES LURULURULURULURULURRDDDDDDDDDR... |
user output |
---|
NO YES DDDDDDDDDDDDDDDDDDDDDDRRULURUL... Truncated |
Test 6
Group: 5
Verdict: ACCEPTED
input |
---|
100 31 38 18 35 31 37 35 48 7 13 21 21 46 21 25 2 4 19 35 2 13 2 35 1 ... |
correct output |
---|
YES LLLLLLLLLLLLDRRRRRRRRRRRRDLLLL... |
user output |
---|
YES UUUUUUUUUUUUUUUULDDDDDDDDDDDDD... Truncated |
Test 7
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100 2 4 1 3 1 4 2 4 2 2 1 1 2 4 2 3 1 2 2 4 2 3 1 4 ... |
correct output |
---|
YES LLDRRRU NO NO NO ... |
user output |
---|
YES LLDRRRU NO NO NO ... Truncated |
Test 8
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100 2 5 1 2 2 4 2 5 1 2 1 1 2 5 2 1 1 2 2 5 1 1 1 5 ... |
correct output |
---|
YES LDRRURRDL YES RRRDLLLLU NO ... |
user output |
---|
YES LDRRURRDL YES RRRDLLLLU NO ... Truncated |
Test 9
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 4 1 1 2 3 3 4 2 4 3 2 3 4 2 1 3 1 3 4 1 4 3 4 ... |
correct output |
---|
YES DDRRRUULLDR NO YES URRRDDLULDL ... |
user output |
---|
YES DDRUURRDDLU NO YES URRRDDLULDL ... Truncated |
Test 10
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 5 3 4 3 2 3 5 3 5 2 3 3 5 3 1 2 2 3 5 3 1 3 2 ... |
correct output |
---|
NO NO YES UURRRRDDLULDLU NO ... |
user output |
---|
NO NO YES UURRRRDDLULDLU NO ... Truncated |
Test 11
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 8 2 8 1 2 3 8 2 4 1 7 3 8 3 4 2 7 3 8 2 5 3 1 ... |
correct output |
---|
NO NO NO YES LLLDRRRRURDRUULLLLLLLDD ... |
user output |
---|
NO NO NO YES URRRDDLULDLLUULDDLUULDD ... Truncated |
Test 12
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 9 1 3 2 9 3 9 1 6 1 5 3 9 3 6 2 8 3 9 3 2 3 4 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 13
Group: 4, 5
Verdict: ACCEPTED
input |
---|
100 4 4 2 2 1 4 4 4 4 1 2 2 4 4 2 1 4 3 4 4 3 1 3 3 ... |
correct output |
---|
YES DDLUUURRDDDRUUU YES UUURRRDLDRDLLUU NO ... |
user output |
---|
YES DRRDLLLUUURRDRU YES RULUURRRDDDLUUL NO ... Truncated |
Test 14
Group: 5
Verdict: ACCEPTED
input |
---|
100 12 27 6 22 1 8 6 25 3 2 4 4 6 16 4 6 5 2 36 33 8 6 1 6 ... |
correct output |
---|
YES DLDDDDDRUUUURDDDDRUURDDRRULURU... |
user output |
---|
YES UUULDDDLUUULDDDLUUULDDDLUUULDD... Truncated |
Test 15
Group: 3, 5
Verdict: ACCEPTED
input |
---|
100 3 12 3 5 1 4 3 20 3 19 2 19 3 34 3 9 2 9 3 38 2 15 3 15 ... |
correct output |
---|
YES RRRRRRRUULDLULDLULDLULDLDLULDL... |
user output |
---|
YES RURDRURDRURDRUULLLLLLLDLDLULDL... Truncated |
Test 16
Group: 5
Verdict: ACCEPTED
input |
---|
100 50 50 29 1 16 21 50 50 37 5 23 48 50 50 32 22 45 24 50 50 6 28 12 37 ... |
correct output |
---|
YES DDDDDDDDDDDDDDDDDDDDDRUUUUUUUU... |
user output |
---|
YES DDDDDDDDDDDDDDDDDDDDDRUUUUUUUU... Truncated |