Submission #139068

#TimeUsernameProblemLanguageResultExecution timeMemory
139068mlyean00Zalmoxis (BOI18_zalmoxis)C++14
95 / 100
1074 ms33900 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;
    }

    unsigned int st = 1 << 30;
    for (auto it = a.begin(); it != a.end(); ++it) {
        if (*it < __builtin_ctz(st)) {
            st |= 1 << *it;
        } else if (*it == __builtin_ctz(st)) {
            st += 1 << *it;
        } else {
            int h = __builtin_ctz(st);
            rem -= 1 << h;
            it = a.insert(it, h);
            st += 1 << h;
        }
    }

    list<int> b;
    while (__builtin_ctz(st) < 30) {
        int h = __builtin_ctz(st);
        rem -= 1 << h;
        b.push_back(h);
        trace(h);
        st += 1 << h;
    }

    assert(rem >= 0);

    for (; rem; rem -= rem & -rem) {
        b.push_back(__builtin_ctz(rem));
    }

    int left = (n + k) - (a.size() + b.size());
    assert(left >= 0);

    auto it = b.begin();
    for (int i = 0; i < left; ++i) {
        while (*it == 0)
            ++it;
        --(*it);
        it = b.insert(it, *it);
    }

    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...