답안 #677408

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677408 2023-01-03T08:10:56 Z jhwest2 기억 압축 (JOI15_memory) C++17
30 / 100
6000 ms 467392 KB
#include "Memory_lib.h"
#include <bits/stdc++.h>
using namespace std;

namespace {
    const int N = 101;
    const int B = 1 << 22;

    const int D1 = 101;
    const int D2 = 101 * 101;
    const int D3 = 101 * 101 * 101;
    const int D4 = 101 * 101 * 101 * 101;

    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 + D1 * x + D2 * t + D3 * s + D4 * 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 % D1; val /= D1;
    int x = val % D1; val /= D1;
    int t = val % D1; val /= D1;
    int s = val % D1; val /= D1;
    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 + D1 * x + D2 * t + D3 * s + D4 * rev];
            }
            else {
                rev = 1;
                s = n;
                t = n;
                return mp[y + D1 * x + D2 * t + D3 * s + D4 * 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 + D1 * x + D2 * t + D3 * s + D4 * rev];
                }
                else {
                    if (s != n) {
                        s = s + 1;
                        t = s;
                        x = 0;
                        y = 0;
                        return mp[y + D1 * x + D2 * t + D3 * s + D4 * rev];
                    }
                    else {
                        rev = 1;
                        s = n;
                        t = n;
                        x = 0;
                        y = 0;
                        return mp[y + D1 * x + D2 * t + D3 * s + D4 * rev];
                    }
                }
            }
        }
    }
    else {
        if (s == t && (c == '<' || c == '[')) {
            if (s != 1) {
                s = s - 1;
                t = t - 1;
                return mp[y + D1 * x + D2 * t + D3 * s + D4 * 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 + D1 * x + D2 * t + D3 * s + D4 * rev];
                }
                else {
                    if (s != 1) {
                        s = s - 1;
                        t = s;
                        x = 0;
                        y = 0;
                        return mp[y + D1 * x + D2 * t + D3 * s + D4 * rev];
                    }
                    else
                        return -1;
                }
            }
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2109 ms 284084 KB Output is correct
2 Correct 2052 ms 284268 KB Output is correct
3 Correct 2044 ms 284200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2109 ms 284084 KB Output is correct
2 Correct 2052 ms 284268 KB Output is correct
3 Correct 2044 ms 284200 KB Output is correct
4 Correct 2052 ms 284180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2109 ms 284084 KB Output is correct
2 Correct 2052 ms 284268 KB Output is correct
3 Correct 2044 ms 284200 KB Output is correct
4 Correct 2052 ms 284180 KB Output is correct
5 Correct 2085 ms 285008 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2109 ms 284084 KB Output is correct
2 Correct 2052 ms 284268 KB Output is correct
3 Correct 2044 ms 284200 KB Output is correct
4 Correct 2052 ms 284180 KB Output is correct
5 Correct 2085 ms 285008 KB Output is correct
6 Correct 2092 ms 285728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6091 ms 467392 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2109 ms 284084 KB Output is correct
2 Correct 2052 ms 284268 KB Output is correct
3 Correct 2044 ms 284200 KB Output is correct
4 Correct 2052 ms 284180 KB Output is correct
5 Correct 2085 ms 285008 KB Output is correct
6 Correct 2092 ms 285728 KB Output is correct
7 Execution timed out 6091 ms 467392 KB Time limit exceeded
8 Halted 0 ms 0 KB -