Submission #1201742

#TimeUsernameProblemLanguageResultExecution timeMemory
1201742madamadam3Art Collections (BOI22_art)C++20
0 / 100
1 ms408 KiB
#include "art.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; #define all(x) (x).begin(), (x).end() #define mp(x) iota(all((x)), 1) int n; /* where[x] vector of length N+1, stores the position of collection x in the permutation (-1 if we dont know) who[pos] vector of length N+1, stores which collection is currently at position pos in the permutation (-1 if we dont know) */ vi invert(vi &where) { vi who(n+1, -1); for (int i = 1; i <= n; i++) { if (where[i] != -1) who[where[i]] = i; } return who; } struct State { vi where, who; set<int> unused; }; vi make_perm(State state) { vi rt(n, -1); for (int i = 1; i <= n; i++) { if (state.where[i] == -1) continue; rt[state.where[i] - 1] = i; } int cur_pos = 0; for (auto &el : state.unused) { while (rt[cur_pos] != -1) cur_pos++; rt[cur_pos] = el; } return rt; } int best_at(State state, int pos) { auto ns = state; int best = INT_MAX, best_node = -1; for (int i = 1; i <= n; i++) { if (!state.unused.count(i)) continue; ns.unused.erase(i); ns.where[i] = pos; ns.who = invert(ns.where); int res = publish(make_perm(ns)); ns.where[i] = -1; ns.who = invert(ns.where); ns.unused.insert(i); if (res < best) { best = res; best_node = i; } } return best_node; } void solve(int N) { n = N; // find the best node for each index and recompute state State state; for (int i = 1; i <= n; i++) state.unused.insert(i); state.where.assign(n+1,-1); state.who.assign(n+1,-1); for (int i = 1; i <= n; i++) { int best = best_at(state, i); state.unused.erase(best); state.where[best] = i; state.who = invert(state.where); } vector<int> vorder(n); for (int i = 1; i <= n; i++) { vorder[i-1] = state.who[i]; } answer(vorder); }
#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...