Submission #1135066

#TimeUsernameProblemLanguageResultExecution timeMemory
1135066skyciaXor Sort (eJOI20_xorsort)C++20
65 / 100
39 ms1224 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> liczby;
int wynik = 0;
vector<pair<int, int>> zmiany;

void zmien(int a, int b)
{
    swap(liczby[a], liczby[b]);
    wynik += 3;
    zmiany.push_back({a, b});
    zmiany.push_back({b, a});
    zmiany.push_back({a, b});
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, p, akt;
    cin >> n >> p;

    for (int i = 0; i < n; i++)
    {
        cin >> akt;
        liczby.push_back(akt);
    }

    if (p == 1)
    {
        int zmiana = 1;
        while (zmiana)
        {
            zmiana = 0;
            for (int i = 0; i < n - 1; i++)
            {
                if (liczby[i] > liczby[i + 1])
                {
                    zmiana = 1;
                    zmien(i, i + 1);
                }
            }
        }
    }
    else
    {
        int maxpot = 1;
        for (auto i : liczby)
        {
            while (i >= 2 * maxpot)
            {
                maxpot *= 2;
            }
        }

        cerr << maxpot;

        int ilemniej = 1;
        while (maxpot >= 1)
        {
            int mogepominac = 1;
            for (int i = 0; i < n - ilemniej; i++)
            {
                if (mogepominac && liczby[i] < maxpot)
                {
                    continue;
                }
                if (liczby[i] > maxpot)
                {
                    mogepominac = 0;
                }
                if (liczby[i + 1] < maxpot)
                {
                    zmiany.push_back({i + 1, i});
                    wynik++;
                    liczby[i + 1] = (liczby[i + 1] ^ liczby[i]);
                }
                zmiany.push_back({i, i + 1});
                wynik++;
                liczby[i] = (liczby[i] ^ liczby[i + 1]);
            }
            ilemniej++;
            maxpot /= 2;
        }
    }

    cout << wynik << endl;
    for (auto i : zmiany)
    {
        cout << i.first + 1 << ' ' << i.second + 1 << endl;
    }

    // for (auto i : liczby)
    // {
    //     cerr << i << ' ';
    // }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...