제출 #677407

#제출 시각아이디문제언어결과실행 시간메모리
677407jhwest2기억 압축 (JOI15_memory)C++17
30 / 100
2087 ms285820 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...