Submission #460752

#TimeUsernameProblemLanguageResultExecution timeMemory
460752Tenis0206Xor Sort (eJOI20_xorsort)C++11
100 / 100
8 ms1032 KiB
#include <bits/stdc++.h>

using namespace std;
int n,s,v[100005],aux[100005];
bool get_bit(int val, int b)
{
    return ((val&(1<<b))!=0);
}
void debug(int *a)
{
    for(int i=1;i<=n;i++)
    {
        cerr<<a[i]<<' ';
    }
    cerr<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>s;
    for(int i=1; i<=n; i++)
    {
        cin>>v[i];
    }
    if(s==1)
    {
        vector<pair<int,int>> rez;
        for(int i=1;i<=n;i++)
        {
            aux[i] = v[i];
        }
        for(int i=1;i<n;i++)
        {
            int poz = 0;
            for(int j=1;j<=n-i+1;j++)
            {
                if(aux[j]>aux[poz])
                {
                    poz = j;
                }
            }
            for(int j=1;j<=n-i;j++)
            {
                v[j]^=v[j+1];
                rez.push_back({j,j+1});
            }
            int x = aux[poz];
            for(int j=poz;j<n-i+1;j++)
            {
                aux[j] = aux[j+1];
            }
            aux[n-i+1] = x;
            for(int j=poz+1;j<=n-i+1;j++)
            {
                v[j]^=v[j-1];
                rez.push_back({j,j-1});
            }
            for(int j=poz-2;j>=1;j--)
            {
                v[j]^=v[j+1];
                rez.push_back({j,j+1});
            }
        }
        for(int i=n-1;i>=1;i--)
        {
            v[i]^=v[i+1];
            rez.push_back({i,i+1});
        }
        cout<<rez.size()<<'\n';
        for(auto it : rez)
        {
            cout<<it.first<<' '<<it.second<<'\n';
        }
        return 0;
    }
    vector<pair<int,int>> rez;
    for(int b=0; b<20; b++)
    {
        for(int i=2; i<=n; i++)
        {
            if(get_bit(v[i-1],b)==0)
            {
                continue;
            }
            if(get_bit(v[i],b)==1 && get_bit(v[i-1],b)==1)
            {
                rez.push_back({i-1,i});
                v[i-1]^=v[i];
                continue;
            }
            if(get_bit(v[i],b)==0 && get_bit(v[i-1],b)==1)
            {
                rez.push_back({i,i-1});
                v[i]^=v[i-1];
                rez.push_back({i-1,i});
                v[i-1]^=v[i];
            }
        }
    }
    cout<<rez.size()<<'\n';
    for(auto it : rez)
    {
        cout<<it.first<<' '<<it.second<<'\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...