답안 #677383

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677383 2023-01-03T07:14:17 Z Cross_Ratio 기억 압축 (JOI15_memory) C++14
0 / 100
0 ms 212 KB
#include "Memory_lib.h"
#include <bits/stdc++.h>
using namespace std;
int pw[25];
int val(int s, int e, int M) {
    int val = 0, cnt = 1;
    for(int i=s;i<e;i++) {
        val += (M & pw[i]) * cnt;
        cnt *= 2;
    }
    return val;
}
int Memory(int N, int M) {
    int i;
    pw[0] = 1;
    for(i=1;i<=23;i++) pw[i] = pw[i-1] * 2;
    int st = val(0, 7, M);
    int pt = val(7, 14, M);
    int cnt = val(14, 21, M);
    int k = val(21, 22, M);
    if(st==pt) {
        char c = Get(st+1);
        if(c=='<' || c=='[') {
            if(st+1==N) return -2;
            int v = st + pw[7] * (st+1) + pw[14] * 1 + pw[21] * (c=='<'?1:0);
            return v;
        }
        else {
            if(st-1<0) return -2;
            int v = st + pw[7] * (st - 1) + pw[14] * 1 + pw[21] * (c=='>'?1:0);
            return v;
        }
    }
    char c = Get(pt+1);
    if(c=='<'||c=='[') {
        if(st < pt) {
            if(pt+1==N) return -2;
            int v = st + pw[7] * (pt + 1) + pw[14] * (cnt + 1) + pw[21] * k;
            return v;
        }
        else { // pt < st case
            if(cnt==1) {
                int k2 = (c=='<'?1:0);
                if(k==k2) {
                    if(st+1==N) return -1;
                    int v = st+1 + pw[7] * (st+1) + pw[14] * 0 + pw[21] * 0;
                    return v;
                }
                else return -2;
            }
            else {
                if(pt-1<0) return -2;
                int v = st + pw[7] * (pt - 1) + pw[14] * (cnt - 1) + pw[21] *k;
                return v;
            }
        }
    }
    else { // c == '>' || c == ']'
        if(st<pt) {
            if(cnt==1) {
                int k2 = (c=='>'?1:0);
                if(k==k2) {
                    if(st+1==N) return -1;
                    int v = st+1 + pw[7] * (st+1) + pw[14] * 0 + pw[21] * 0;
                    return v;
                }
                else return -2;
            }
            else {
                if(pt+1==N) return -2;
                int v = st + pw[7] * (pt+1) + pw[14] * (cnt-1) + pw[21] * k;
                return v;
            }
        }
        else { // pt < st
            if(pt-1<0) return -2;
            int v = st + pw[7] * (pt-1) + pw[14] * (cnt+1) + pw[21] * k;
            return v;
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -