Submission #1233095

#TimeUsernameProblemLanguageResultExecution timeMemory
1233095GabrielAncient Books (IOI17_books)C++20
0 / 100
2098 ms120992 KiB
#include "books.h" #include "bits/stdc++.h" using namespace std; int n; struct No_repetir{ vector<int> p; int Inicio, Posici_n, Mano; }; bool operator<(const No_repetir& a, const No_repetir& b){ if(a.p < b.p) return 1; if(a.p > b.p) return 0; if(a.Inicio < b.Inicio) return 1; if(a.Inicio > b.Inicio) return 0; if(a.Posici_n < b.Posici_n) return 1; if(a.Posici_n > b.Posici_n) return 0; return a.Mano < b.Mano; } map<No_repetir, long long> Programaci_n_din_mica_que_parece_recursi_n; set<No_repetir> No; long long Resolver(vector<int> p, int Inicio, int Posici_n, int Mano){ /*for(auto E: p) cerr<<E<<" "; cerr<<"\n"<<Inicio<<" "<<Posici_n<<" "<<Mano<<"\n";*/ bool Bien = 1; for(int i = 0; i < n and Bien; i++) if(p[i] != i) Bien = 0; if(Bien) return abs(Posici_n - Inicio); No_repetir Estado; Estado.Inicio = Inicio; Estado.Mano = Mano; Estado.p = p; Estado.Posici_n = Posici_n; if(Programaci_n_din_mica_que_parece_recursi_n.count(Estado) == 1) return Programaci_n_din_mica_que_parece_recursi_n.count(Estado); if(No.count(Estado) == 1) return 2222222222222222; No.insert(Estado); long long r = 2222222222222222; if(Mano == -2){ for(int i = 0; i < n; i++){ swap(Mano, p[i]); r = min(r, Resolver(p, Inicio, i, Mano) + abs(i - Posici_n)); swap(Mano, p[i]); } } else { int Ir = Mano; swap(p[Mano], Mano); r = min(r, Resolver(p, Inicio, Ir, Mano) + abs(Ir - Posici_n)); } No.erase(Estado); if(No.empty()) return Programaci_n_din_mica_que_parece_recursi_n[Estado] = r; else return r; } long long minimum_walk(vector<int> p, int s){ n = p.size(); return Resolver(p, s, 0, -2); }
#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...