제출 #1321123

#제출 시각아이디문제언어결과실행 시간메모리
1321123layk콤보 (IOI18_combo)C++20
100 / 100
10 ms504 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <immintrin.h>
#include "combo.h"

#ifndef DEBUG
//#pragma GCC optimize("O3")
//#pragma GCC target("avx2")
#endif

using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
//
using ld = long double;
using ll = int;
using i128 = __int128;
using ull = unsigned long long;
using pll = std::pair<ll, ll>;
using cmpl = std::complex<ld>;
template<typename T>
using oset = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>;

constexpr ll MOD1 = 998244353;
constexpr ll MOD = 1000000007;
constexpr ll INV2 = 499122177;
constexpr ld PI = 3.141592653589793;
const ld eps = 1e-7;
const ll K = 3;
//const ll C = 200;

std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());

ld START_TIME = clock();

std::string ans;

int ask(std::string c){
    std::string c1;
    if (c.size() == 4){
        char X = c[0], A = c[2];
        c1 += ans + X + X + A + ans + A + A + ans + X + A + A;
    }
    else{
        std::string pref;
        std::reverse(c.begin(), c.end());
        ll c2 = c.size();
        for (int i = 0; i < c2; ++i) {
            pref = c;
            std::reverse(pref.begin(), pref.end());
            c1 += ans + pref;
            c.pop_back();
        }
    }
    return press(c1);
}

string guess_sequence(int N){
    ans = "";
    std::string cor;
    for (int cur = 0; cur < N; cur = ans.size()) {
        ll old = ans.size();
        if (cur == 0){
            if (ask("AB")){
                if (ask("B")){
                    ans += 'B';
                    cor = "AXY";
                }
                else{
                    ans += 'A';
                    cor = "BXY";
                }
            }
            else{
                if (ask("X")){
                    ans += 'X';
                    cor = "ABY";
                }
                else{
                    ans += 'Y';
                    cor = "BXA";
                }
            }
        }
        else if (cur == N - 1){
            if (ask("AB") - old){
                if (ask("B") - old){
                    ans += 'B';
                    cor = "AXY";
                }
                else{
                    ans += 'A';
                    cor = "BXY";
                }
            }
            else{
                if (ask("X") - old){
                    ans += 'X';
                    cor = "ABY";
                }
                else{
                    ans += 'Y';
                    cor = "BXA";
                }
            }
        }
        else{
            std::string A, B, X; A += cor[0], B += cor[1], X += cor[2];
            int dd = ask(X + X + A + A);
            if (dd - old == 0){
                ans += B;
            }
            else if (dd - old == 3){
                ans += X;
            }
            else if (dd - old == 2){
                dd = press(ans + X + X) - old;
                if (dd == 0){
                    ans += A + A;
                }
                else if (dd == 1){
                    ans += X + A;
                }
                else{
                    ans += X + X;
                }
            }
            else{
                dd = press(ans + A + X) - old;
                if (dd == 0){
                    ans += X + B;
                }
                else if (dd == 1){
                    ans += A + B;
                }
                else{
                    ans += A + X;
                }
            }
        }
    }
    return ans;
}

//signed main() {
//#ifdef DEBUG
//    std::freopen("/home/anton/CLionProjects/untitled/input.txt", "r", stdin);
//#else
//    //    std::freopen("tri.in", "r", stdin); std::freopen("tri.out", "w", stdout);
//#endif
//    std::cin.tie(nullptr)->std::ios_base::sync_with_stdio(false);
//    int tt = 1;
////    std::cin >> tt;
//    while (tt--) {
////        solve();
//    }
//#ifdef DEBUG
//    std::cerr << '\n';
//    ld TIME = (clock() - START_TIME) / CLOCKS_PER_SEC;
//    std::cerr << "Time: " << TIME << '\n';
//#endif
//}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...