Submission #20605

#TimeUsernameProblemLanguageResultExecution timeMemory
20605model_codeUnscrambling a Messy Bug (IOI16_messy)C++11
100 / 100
5 ms512 KiB
// name = messy_tourist.cpp, type = cpp.g++11 #include "messy.h" #include <bits/stdc++.h> //#include "messy.h" using namespace std; int N; void put(int i, int j) { string s(N, '0'); s[i] = s[j] = '1'; add_element(s); } void put(int i, int j, int k) { string s(N, '0'); s[i] = s[j] = s[k] = '1'; add_element(s); } bool check(int i, int j) { string s(N, '0'); s[i] = s[j] = '1'; return check_element(s); } bool check(int i, int j, int k) { string s(N, '0'); s[i] = s[j] = s[k] = '1'; return check_element(s); } bool g[1234][1234]; vector<int> restore_permutation(int nnn, int w, int r) { N = nnn; int k = 0; while ((1 << k) != N) { k++; } if (k < 4) { string s(N, '0'); for (int i = 0; i < N; i++) { s[i] = '1'; add_element(s); } compile_set(); string t(N, '0'); vector <int> ans(N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (t[j] != '0') { continue; } t[j] = '1'; if (check_element(t)) { ans[j] = i; break; } t[j] = '0'; } } return ans; } for (int i = 0; i < k; i++) { put(i, i); } put(0, 1); put(0, 2); put(1, 2); for (int i = 2; i + 1 < k; i++) { put(i, i + 1); } put(1, 2, 3); for (int i = k; i < N; i++) { for (int j = 0; j < k; j++) { if (i & (1 << j)) { put(i, j); } } } compile_set(); vector <int> imp; for (int i = 0; i < N; i++) { if (check(i, i)) { imp.push_back(i); } } assert(imp.size() == k); for (int i = 0; i < k; i++) { for (int j = i + 1; j < k; j++) { g[imp[i]][imp[j]] = g[imp[j]][imp[i]] = check(imp[i], imp[j]); } } bool found = false; do { if (!g[imp[0]][imp[1]] || !g[imp[0]][imp[2]] || !g[imp[1]][imp[2]]) { continue; } bool ok = true; for (int i = 2; i + 1 < k; i++) { if (!g[imp[i]][imp[i + 1]]) { ok = false; break; } } if (ok) { if (!check(imp[1], imp[2], imp[3])) { continue; } found = true; break; } } while (next_permutation(imp.begin(), imp.end())); assert(found); vector <int> ans(N, -1); vector <bool> used(N, false); for (int i = 0; i < k; i++) { ans[imp[i]] = i; used[i] = true; } for (int i = 0; i < N; i++) { if (ans[i] != -1) { continue; } int u = 0; for (int j = k - 1; j >= 0; j--) { int options = 0; int any = -1; for (int z = u; z < u + (1 << (j + 1)); z++) { if (!used[z]) { options++; any = z; } } if (options == 1) { u = any; break; } if (check(i, imp[j])) { u |= (1 << j); } } ans[i] = u; used[u] = true; } return ans; }

Compilation message (stderr)

In file included from /usr/include/c++/7/cassert:44:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33,
                 from messy.cpp:6:
messy.cpp: In function 'std::vector<int> restore_permutation(int, int, int)':
messy.cpp:94:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   assert(imp.size() == k);
          ~~~~~~~~~~~^~~~
#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...