Submission #1294148

#TimeUsernameProblemLanguageResultExecution timeMemory
1294148vincentbucourt1Unscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
2 ms588 KiB
#include "messy.h" #include <bits/stdc++.h> using namespace std; int N; vector<int> perm; void addElemPos (vector<int>& posOn) { string elem; for (int i = 0; i < N; i++) elem += '0'; for (int i : posOn) elem[i] = '1'; add_element(elem); } bool checkElemPos (vector<int>& posOn) { string elem; for (int i = 0; i < N; i++) elem += '0'; for (int i : posOn) elem[i] = '1'; return check_element(elem); } void printElemPos (vector<int>& posOn) { string elem; for (int i = 0; i < N; i++) elem += '0'; for (int i : posOn) elem[i] = '1'; cout << elem << "\n"; } void addElemVec (vector<int>& vecElem) { assert((int)vecElem.size() == N); string elem; for (int i = 0; i < N; i++) elem += (vecElem[i] + '0'); add_element(elem); } bool checkElemVec (vector<int>& vecElem) { assert((int)vecElem.size() == N); string elem; for (int i = 0; i < N; i++) elem += (vecElem[i] + '0'); return check_element(elem); } void insert (int l, int r) { if (r-l+1 <= 2) { return; } vector<int> posOn; int mid = (r+l)/2, midL = (l + mid)/2, midR = (r + mid+1)/2; for (int i = mid + 1; i <= r; i++) { posOn.emplace_back(i); } for (int i = l; i <= midL; i++) { posOn.emplace_back(i); addElemPos(posOn); // printElemPos(posOn); posOn.pop_back(); } posOn.clear(); for (int i = l; i <= mid; i++) { posOn.emplace_back(i); } for (int i = mid+1; i <= midR; i++) { posOn.emplace_back(i); addElemPos(posOn); // printElemPos(posOn); posOn.pop_back(); } if (r-l+1 > 4) { insert(l, mid); insert(mid + 1, r); } } int t = 0; void query (vector<int>& posL, vector<int>& posR) { int l = (int)posL.size(), r = (int)posR.size(); if (l == 1 && r == 1) { perm[posL[0]] = t++; perm[posR[0]] = t++; return; } vector<int> posOn; vector<int> posLL, posLR; for (int pR : posR) posOn.emplace_back(pR); for (int pL : posL) { posOn.emplace_back(pL); if (checkElemPos(posOn)) { posLL.emplace_back(pL); } else { posLR.emplace_back(pL); } posOn.pop_back(); } assert((int)posLL.size() <= (int)posL.size() / 2); assert((int)posLR.size() <= (int)posL.size() / 2); query(posLL, posLR); posOn.clear(); vector<int> posRL, posRR; for (int pL : posL) posOn.emplace_back(pL); for (int pR : posR) { posOn.emplace_back(pR); if (checkElemPos(posOn)) { posRL.emplace_back(pR); } else { posRR.emplace_back(pR); } posOn.pop_back(); } query(posRL, posRR); } std::vector<int> restore_permutation(int n, int w, int r) { N = n; for (int i = 0; i < N/2; i++) { vector<int> p = {i}; addElemPos(p); // printElemPos(p); } insert(0, N-1); compile_set(); vector<int> posL, posR; for (int i = 0; i < N; i++) { vector<int> p = {i}; if (checkElemPos(p)) { posL.emplace_back(i); } else { posR.emplace_back(i); } } perm.resize(N); query(posL, posR); return perm; }

Compilation message (stderr)

messy.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
messy_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...