Submission #1101154

#TimeUsernameProblemLanguageResultExecution timeMemory
1101154MateiKing80Swap (BOI16_swap)C++14
100 / 100
510 ms233896 KiB
#include <bits/stdc++.h>

using namespace std;

int a[200002];
bool nevoie[200002][18][2];
vector<int> dp[200002][18][2], sus, sus2;

void mrg(vector<int> &ret, vector<int> &l, vector<int> &r)
{
    for(int i = 0, j = 1; i < l.size(); i += j, j <<= 1)
    {
        for(int k = i; k < i + j && k < l.size(); k ++)
            ret.push_back(l[k]);
        for(int k = i; k < i + j && k < r.size(); k ++)
            ret.push_back(r[k]);
    }
}

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++)
        cin >> a[i];
    nevoie[1][0][1] = 1;
    for(int nod = 1; nod <= n / 2; nod ++)
        for(int i = 0; nod >> i; i ++)
            for(int j :{0, 1})
            {
                if(!nevoie[nod][i][j])
                    continue;
                int mn = min({a[((nod >> i + 1) << 1) + j], a[2 * nod], a[2 * nod + 1]});
                if(mn == a[((nod >> i + 1) << 1) + j])
                    nevoie[2 * nod][0][0] = nevoie[2 * nod + 1][0][1] = 1;
                else if(mn == a[2 * nod])
                    nevoie[2 * nod][i + 1][j] = nevoie[2 * nod + 1][0][1] = 1;
                else
                {
                    nevoie[2 * nod][0][0] = nevoie[2 * nod][i + 1][j] = 1;
                    nevoie[2 * nod + 1][0][0] = nevoie[2 * nod + 1][i + 1][j] = 1;
                }
            }
    for(int nod = n; nod; nod --)
    {
        for(int i = 0; nod >> i; i ++)
            for(int j = 0; j < 2; j ++)
            {
                if(!nevoie[nod][i][j])
                    continue;
                int p = ((nod >> i + 1) << 1) + j;
                if(2 * nod > n)
                    dp[nod][i][j] = {a[p]};
                else if(2 * nod == n)
                    dp[nod][i][j] = {min(a[p], a[2 * nod]), max(a[p], a[2 * nod])};
                else if(a[2 * nod + 1] < min(a[p], a[2 * nod]))
                {
                    sus = sus2 = {a[2 * nod + 1]};
                    mrg(sus, dp[2 * nod][0][0], dp[2 * nod + 1][i + 1][j]);
                    mrg(sus2, dp[2 * nod][i + 1][j], dp[2 * nod + 1][0][0]);
                    dp[nod][i][j] = min(sus, sus2);
                }
                else
                {
                    dp[nod][i][j] = {min(a[p], a[2 * nod])};
                    if(a[p] < a[2 * nod])
                        mrg(dp[nod][i][j], dp[2 * nod][0][0], dp[2 * nod + 1][0][1]);
                    else
                        mrg(dp[nod][i][j], dp[2 * nod][i + 1][j], dp[2 * nod + 1][0][1]);
                }
            }
        if(2 * nod < n)
            for(int i = 0; 2 * nod >> i; i ++)
                for(int j = 0; j < 2; j ++)
                {
                    vector<int>().swap(dp[2 * nod][i][j]);
                    vector<int>().swap(dp[2 * nod + 1][i][j]);
                }
    }
    for(int i : dp[1][0][1])
        cout << i << " ";
    return 0;
}

Compilation message (stderr)

swap.cpp: In function 'void mrg(std::vector<int>&, std::vector<int>&, std::vector<int>&)':
swap.cpp:11:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |     for(int i = 0, j = 1; i < l.size(); i += j, j <<= 1)
      |                           ~~^~~~~~~~~~
swap.cpp:13:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |         for(int k = i; k < i + j && k < l.size(); k ++)
      |                                     ~~^~~~~~~~~~
swap.cpp:15:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |         for(int k = i; k < i + j && k < r.size(); k ++)
      |                                     ~~^~~~~~~~~~
swap.cpp: In function 'int main()':
swap.cpp:33:44: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |                 int mn = min({a[((nod >> i + 1) << 1) + j], a[2 * nod], a[2 * nod + 1]});
      |                                          ~~^~~
swap.cpp:34:39: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   34 |                 if(mn == a[((nod >> i + 1) << 1) + j])
      |                                     ~~^~~
swap.cpp:51:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |                 int p = ((nod >> i + 1) << 1) + j;
      |                                  ~~^~~
#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...