3547 2023. 02. 28 21:11:49 Ablablabla Autókódolás cpp17 Elfogadva 50/50 3ms 3776 KiB
#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long int n;
    cin >> n;
    vector<int> alap;
    long long int eredeti = n;
    int valtKezdKis = -1;
    int valtKezdNagy = -1;
    bool elsok = true;
    bool elson = true;
    int egysz = 0;
    int egyszk, egyszn;
    long long int valtozas = 2;
    long long int valtozask, valtozasn;
    alap.push_back(n % 2);
    if(n % 2 == 1){
        egysz++;
    }
    n /= 2;
    while(n > 0){
        alap.push_back(n % 2);
        if(n % 2 == 1){egysz++;}
        //cout << n % 2 << " ";
        n /= 2;
        //cout << n << "\n";
        valtozas *= 2;
        if(elsok && alap[alap.size() - 1] == 1 && alap[alap.size() - 2] == 0){  //kicsi 10 t keresünk
            valtKezdKis = alap.size() - 2;
            egyszk = egysz - 1;
            valtozask = valtozas / 4;
            elsok = false;
        }

        if(elson && alap[alap.size() - 1] == 0 && alap[alap.size() - 2] == 1){  //nagy 01 t keresünk
            valtKezdNagy = alap.size() - 2;
            egyszn = egysz - 1;
            valtozasn = valtozas / 4;
            elson = false;
        }
    }

    long long int valaszk = eredeti;
    long long int valaszn = eredeti;
    long long int hatvany = 1;
    if(elsok){
        valaszk = -1;
        elsok = false;
    } else{
        for(int i = 0; i < valtKezdKis; i++){
            if(alap[i] == 1 && i < valtKezdKis - egyszk){
                valaszk -= hatvany;
            } else if(alap[i] == 0 && i >= valtKezdKis - egyszk){
                valaszk += hatvany;
            }
            hatvany *= 2;
        }
        valaszk -= valtozask;
    }

    hatvany = 1;
    if(elson){
        alap.push_back(0);
        valtKezdNagy = alap.size() - 2;
        egyszn = egysz - 1;
        valtozasn = valtozas / 2;
        elson = false;
    }
    for(int i = 0; i < valtKezdNagy; i++){
        if(alap[i] == 0 && i < egyszn){
            valaszn += hatvany;
        } else if(alap[i] == 1 && i >= egyszn){
            valaszn -= hatvany;
        }
        hatvany *= 2;
    }
    valaszn += valtozasn;


    /*for(int i = alap.size() - 1; i >= 0; i--){
        cout << alap[i] << " ";
    }*/
    //cout << "\n";
    cout /*<< valtKezdKis << " " << egyszk << " " << valtozask << " " */<< valaszk << "\n";
    cout /*<< valtKezdNagy << " " << egyszn << " " << valtozasn << " " */<< valaszn << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1808 KiB
2 Elfogadva 0/0 3ms 2168 KiB
3 Elfogadva 2/2 3ms 2304 KiB
4 Elfogadva 2/2 3ms 2408 KiB
5 Elfogadva 2/2 3ms 2624 KiB
6 Elfogadva 2/2 3ms 2836 KiB
7 Elfogadva 2/2 3ms 3052 KiB
8 Elfogadva 4/4 3ms 3260 KiB
9 Elfogadva 4/4 2ms 3376 KiB
10 Elfogadva 4/4 3ms 3472 KiB
11 Elfogadva 4/4 2ms 3584 KiB
12 Elfogadva 4/4 2ms 3556 KiB
13 Elfogadva 4/4 3ms 3556 KiB
14 Elfogadva 4/4 3ms 3776 KiB
15 Elfogadva 4/4 3ms 3772 KiB
16 Elfogadva 4/4 3ms 3768 KiB
17 Elfogadva 4/4 3ms 3772 KiB