This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "Memory_lib.h"
#include <bits/stdc++.h>
using namespace std;
namespace {
const int N = 100;
const int B = 1 << 22;
bool init = false;
int sz = 0;
int a[B];
unordered_map<int, int> mp;
void initialize(int n) {
for (int rev = 0; rev <= 1; rev++)
for (int s = 1; s <= n; s++)
for (int t = 1; t <= n; t++)
for (int x = 0; x <= n / 2; x++)
for (int y = 0; y <= n / 2; y++)
if (((!rev && s <= t) || (rev && s >= t)) && (x + y) % 2 == abs(t - s) % 2 && x + y <= abs(t - s))
a[sz++] = y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev;
for (int i = 0; i < sz; i++)
mp[a[i]] = i;
}
}
int Memory(int n, int m) {
if (!init) {
init = true;
initialize(n);
}
if (m >= sz)
return -2;
auto val = a[m];
int y = val % 100; val /= 100;
int x = val % 100; val /= 100;
int t = val % 100; val /= 100;
int s = val % 100; val /= 100;
int rev = val;
char c = Get(t);
if (!rev) {
if (s == t && (c == '>' || c == ']')) {
if (s != n) {
s = s + 1;
t = t + 1;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else {
rev = 1;
s = n;
t = n;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
}
else {
if (c == '[')
++x;
if (c == ']')
--x;
if (c == '<')
++y;
if (c == '>')
--y;
if (x < 0 || y < 0 || x > n / 2 || y > n / 2)
return -2;
else {
if (x != 0 || y != 0) {
t = t + 1;
if (t == n + 1)
return -2;
else
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else {
if (s != n) {
s = s + 1;
t = s;
x = 0;
y = 0;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else {
rev = 1;
s = n;
t = n;
x = 0;
y = 0;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
}
}
}
}
else {
if (s == t && (c == '<' || c == '[')) {
if (s != 1) {
s = s - 1;
t = t - 1;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else
return -1;
}
else {
if (c == ']')
++x;
if (c == '[')
--x;
if (c == '>')
++y;
if (c == '<')
--y;
if (x < 0 || y < 0 || x > n / 2 || y > n / 2)
return -2;
else {
if (x != 0 || y != 0) {
t = t - 1;
if (t == 0)
return -2;
else
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else {
if (s != 1) {
s = s - 1;
t = s;
x = 0;
y = 0;
return mp[y + 100 * x + 10000 * t + 1000000 * s + 100000000 * rev];
}
else
return -1;
}
}
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |