Submission #1083967

#TimeUsernameProblemLanguageResultExecution timeMemory
1083967TymondCombo (IOI18_combo)C++17
100 / 100
25 ms1112 KiB
#include <bits/stdc++.h>
#include "combo.h"
using namespace std;
using ll = long long;
using ld = long double;
#define fi first
#define se second
#define vi vector<int>
#define vll vector<long long>
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());
inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);}
inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);}
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

string guess_sequence(int n) {
    string ans = "";
    if(n == 1){
        if(press("A")){
            return "A";
        }
        if(press("B")){
            return "B";
        }
        if(press("X")){
            return "X";
        }
        return "Y";
    }

    vector<string> vec;
    if(press("AB")){
        if(press("A")){
            ans = "A";
            vec = {"B", "X", "Y"};
        }else{
            ans = "B";
            vec = {"A", "X", "Y"};
        }
    }else{
        if(press("X")){
            ans = "X";
            vec = {"A", "B", "Y"};
        }else{
            ans = "Y";
            vec = {"A", "B", "X"};
        }
    }

    for(int i = 1; i < n - 1; i++){
        string p = ans + vec[0];
        for(int j = 0; j < 3; j++){
            p += ans;
            p += vec[1];
            p += vec[j];
        }

        int k = press(p);
        if(k == sz(ans)){
            ans += vec[2];
        }else if(k == sz(ans) + 1){
            ans += vec[0];
        }else{
            ans += vec[1];
        }
    }

    if(press(ans+vec[0]) == n){
        ans += vec[0];
    }else if(press(ans+vec[1]) == n){
        ans += vec[1];
    }else{
        ans += vec[2];
    }

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