Cod sursa(job #3153953)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 2 octombrie 2023 13:08:30
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("popcnt")

using namespace std;

const int MAX_N = 100000;
int n, m, st, dr, k, target, p[MAX_N + 5];

int main (){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);

    cin>>n;

    ///solve p
    if(n % 2 == 1){
        cout<<"NO\n";
    }else{
        cout<<"YES\n";

        for(int i=1; i<=n; i++)
            p[i] = i;

        m = n;
        while(n != 0){
            k = (int)log2(n);
            target = (1 << (k+1)) - 1;

            st = target - n;
            dr = n;
            n = st-1;
            while(st < dr){
                swap(p[st], p[dr]);
                st++, dr--;
            }
        }

        n = m;
        for(int i=1; i<=n; i++)
            cout<<p[i]<<" ";
        cout<<"\n";
    }

    ///solve q
    if(n < 6){
        cout<<"NO\n";
    }else if(n == 6){
        cout<<"YES\n3 6 2 5 1 4";
    }else if(n >= 7){
        k = (int)log2(n);
        if((1 << k) == n){
            cout<<"NO\n";
        }else{
            cout<<"YES\n";
            p[1] = 7, p[7] = 4, p[4] = 5, p[5] = 1;
            p[2] = 3, p[3] = 6, p[6] = 2;

            for(int pw2=3; pw2<=k; pw2++){
                st = (1 << pw2);
                dr = min((1<<(pw2+1)) - 1, n);
                ///cout<<st<<" "<<dr<<"\n";

                for(int i=st; i < dr; i++)
                    p[i] = i+1;
                p[dr] = st;
            }

            for(int i=1; i<=n; i++)
                cout<<p[i]<<" ";
        }
    }

    return 0;
}
/**
6
**/