제출 #139103

#제출 시각아이디문제언어결과실행 시간메모리
139103mlyean00Zalmoxis (BOI18_zalmoxis)C++14
75 / 100
1075 ms35484 KiB
#ifdef DEBUG #include "debug.hpp" #else #pragma GCC optimize("Ofast") #define trace(...) #include <bits/stdc++.h> #define endl '\n' #endif using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int n, k; cin >> n >> k; list<int> a; int rem = 1 << 30; for (int i = 0; i < n; ++i) { int tmp; cin >> tmp; a.push_back(tmp); rem -= 1 << tmp; } vector<list<int>::iterator> expand; unsigned int st = 1 << 30; for (auto it = a.begin(); it != a.end(); ++it) { int h = __builtin_ctz(st); if (*it < h) { st |= 1 << *it; } else if (*it == h) { st += 1 << *it; } else { rem -= 1 << h; it = a.insert(it, h); expand.push_back(it); st += 1 << h; } } for (int h = __builtin_ctz(st); h < 30; h = __builtin_ctz(st)) { rem -= 1 << h; expand.push_back(a.insert(a.end(), h)); st += 1 << h; } assert(rem >= 0); for (; rem; rem -= rem & -rem) { expand.push_back(a.insert(a.end(), __builtin_ctz(rem))); } int left = n + k - a.size(); assert(left >= 0); for (auto it : expand) { list<int> b = {*it}; auto it2 = b.begin(); while (left > 0 && it2 != b.end()) { while (*it2 == 0 && it2 != b.end()) ++it2; if (it2 == b.end()) break; --(*it2); it2 = b.insert(it2, *it2); --left; } b.splice(b.end(), a, next(it), a.end()); a.pop_back(); a.splice(a.end(), b); } copy(a.begin(), a.end(), ostream_iterator<int>(cout, " ")); cout << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...