제출 #1137430

#제출 시각아이디문제언어결과실행 시간메모리
1137430poatZalmoxis (BOI18_zalmoxis)C++20
20 / 100
925 ms53936 KiB
// #pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;

#define int long long
// #define mkp make_pair
#define txt freopen("kout.in", "r", stdin), freopen("kout.out", "w", stdout);
const int N = 2000, K = 20;
const int mod = 998244353;

void solve() 
{   
    int n, k;
    cin >> n >> k;

    int mn = 1e9;
    vector<int> arr;
    vector<int> vec(n);
    for(auto &i : vec)
    {
        cin >> i;
        arr.push_back(i);
        mn = min(mn, i);
    }

    while(mn < 30)
    {
        vector<int> add;
        double cnt = 0;
        for(int i = 0; i < vec.size(); i++)
        {
            if(vec[i] > mn)
            {
                int k = cnt;
                if(k != ceil(cnt))
                    assert(0);
                if(k % 2)
                    add.push_back(i);
                cnt = 0;
            }
            else
            {
                int k = pow(2, mn - vec[i]);
                cnt = cnt + 1.0 / k;
            }
        }
        int k = cnt;
        if(k != ceil(cnt))
            assert(0);
        if(k % 2)
            add.push_back(vec.size() - 1);
        cnt = 0;
        reverse(add.begin(), add.end());
        vector<int> v2;
        for(int i = 0; i < vec.size(); i++)
        {
            if(!add.empty() && add.back() == i)
            {
                v2.push_back(mn);
                add.pop_back();
            }
            if(i < vec.size())
                v2.push_back(vec[i]);
        }
        vec = v2;
        mn++;
    }
    if(vec.size() > n + k)
        assert(0);
    
    // for(auto i : vec)
    //     cout << i << ' ';
    
    // return;
    int len = n + k - vec.size();
    vector<int> res;
    int ind = 0;
    for(auto i : vec)
    {
        if(len && ind < arr.size() && arr[ind] == i)
        {
            res.push_back(i);
            ind++;
        }
        else 
        {
            if(len >= pow(2, i) - 1)
            {
                len = len - pow(2, i) + 1;
                for(int j = pow(2, i); j--;)
                    res.push_back(0);
            }
            else
            {
                len++;
                vector<int> v = {i};
                for(int j = 0; j <= i; j++)
                {
                    if(pow(2, i - j) <= len)
                    {
                        v.clear();
                        for(int k = pow(2, i - j); k--;)
                            v.push_back(j);
                        len -= pow(2, i - j);
                        break;
                    }
                }
                for(auto j : v)
                {
                    if(!len)
                        res.push_back(j);
                    else
                    {
                        len--;
                        res.push_back(j - 1);
                        res.push_back(j - 1);
                    }
                }
                len = 0;
            }
        }
    }

    for(auto i : res)
        cout << i << ' ';
    cout << '\n';
        
    
}   

signed main()
{
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 1;
    for (; T--; solve());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...