제출 #1332197

#제출 시각아이디문제언어결과실행 시간메모리
1332197QuocSensei비교 (balkan11_cmp)C++20
100 / 100
2984 ms102336 KiB
#include "cmp.h"
#include <bits/stdc++.h>

#define ll long long 
#define el cout << endl;

using namespace std;

const int BASE = 4;
const int maxlog = 6;

vector<int> trans(int n)
{
    vector<int> val;
    for (int _ = 1; _ <= maxlog; _++, n /= BASE)
        val.push_back(n % BASE);
    reverse(val.begin(), val.end());
    return val;
}
int get_pre(vector<int> val, int p)
{
    int ans = 1;
    for (int i = 0; i <= p; i++)
        ans = ans * BASE + val[i];
    return ans;
}

namespace personA
{
    void remember(int a)
    {
        vector<int> val = trans(a);
        for (int i = 0; i < val.size(); i++)
            bit_set(get_pre(val, i));
        // for (int x : val)
        //     cout << x << ' ';
        // el;
    }
}
namespace personB
{
    int compare(int b)
    {
        vector<int> val = trans(b);
        // for (int x : val)
        //     cout << x << ' ';
        // el;
        auto find_p = [=] ()
        {
            int l = 0, r = maxlog - 1, ans = -1;
            while (l <= r)
            {
                int m = l + r >> 1;
                if (bit_get(get_pre(val, m)))
                {
                    ans = m;
                    l = m + 1;
                }
                else
                    r = m - 1;
            }
            return ans;
        };
        int p = find_p();
        if (p == maxlog - 1)
            return 0;
        // cout << p << ' ' << val[p + 1] << ' ' << get_pre(val, p), el;
        if (val[p + 1] <= 1)
        {
            if (bit_get(BASE * get_pre(val, p)))
                return 1;
            return -1;
        }
        if (bit_get(BASE * get_pre(val, p) + 3))
            return -1;
        return 1;
    }
}

void remember(int a)
{
    personA::remember(a);
}
int compare(int b)
{
    return personB::compare(b);
}
#Verdict Execution timeMemoryGrader output
Fetching results...