Submission #1189306

#TimeUsernameProblemLanguageResultExecution timeMemory
1189306anmattroiAncient Books (IOI17_books)C++17
12 / 100
2125 ms1082348 KiB
#include "books.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;

map<vector<int>, int > nho;
map<int, vector<int> > rem;

int kc[120][4][5];

struct node {
    int idx, s, hold;
    node() {}
    node(int _idx, int _s, int _hold) : idx(_idx), s(_s), hold(_hold) {}

    bool operator < (const node &other) const {
        if (idx != other.idx) return idx < other.idx;
        if (s != other.s) return s < other.s;
        return hold < other.hold;
    }
};


/*
4 0
0 2 3 1
*/


long long minimum_walk(vector<int> p, int s) {
    int n = p.size(), cc = 0;
    if (1) {
        vector<int> a(n);
        iota(a.begin(), a.end(), 0);
        do {
            nho[a] = cc;
            rem[cc] = a;
            ++cc;
            for (int i = 0; i < n; i++) {
                int T = a[i];
                a[i] = n;
                nho[a] = cc;
                rem[cc] = a;
                ++cc;
                a[i] = T;
            }
        } while (next_permutation(a.begin(), a.end()));
    }
    for (int i = 0; i < cc; i++) for (int j = 0; j < n; j++) for (int k = 0; k <= n; k++) kc[i][j][k] = INT_MAX;

    set<pair<int, node> > q;

    kc[nho[p]][s][n] = 0;
    q.insert(pair<int, node>{0, node(nho[p], s, n)});
    while (!q.empty()) {
        auto [idx, s, hold] = q.begin()->se; q.erase(q.begin());
        vector<int> cur = rem[idx];

        if (1) {
            vector<int> T = cur;
            T[s] = hold;

            int nex = nho[T];

            if (kc[nex][s][cur[s]] > kc[idx][s][hold]) {
                q.erase(pair<int, node>{kc[nex][s][cur[s]], node(nex, s, cur[s])});
                kc[nex][s][cur[s]] = kc[idx][s][hold];
                q.insert(pair<int, node>{kc[nex][s][cur[s]], node(nex, s, cur[s])});
            }
        }

        for (int i = 0; i < n; i++)
        if (kc[idx][i][hold] > kc[idx][s][hold] + abs(i-s)) {
            q.erase(pair<int, node>{kc[idx][i][hold], node(idx, i, hold)});
            kc[idx][i][hold] = kc[idx][s][hold] + abs(i-s);
            q.insert(pair<int, node>{kc[idx][i][hold], node(idx, i, hold)});
        }
    }
    return kc[0][s][n];
}

#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...