제출 #1353645

#제출 시각아이디문제언어결과실행 시간메모리
1353645ezzzayToxic Gene 2 (NOI24_toxic)C++20
36 / 100
9 ms436 KiB
#include "toxic.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

struct Block {
    int l, len;
};

void determine_type(int n) {
    vector<char> ans(n, 'R');
    vector<Block> uni;
    int anchorT = -1;

    auto make_query = [&](int l, int len) {
        vector<int> vc;
        for (int j = 0; j < len; j++) {
            for (int k = 0; k < (1 << j); k++) vc.pb(l + j);
        }
        return query_machine(vc);
    };

    int B = (n + 7) / 8;

    for (int b = 0; b < B; b++) {
        int l = b * 8;
        int len = min(8, n - l);

        vector<int> p = make_query(l, len);
        int full = (1 << len) - 1;
        int got = p.back();

        if (got == full) {
            uni.pb({l, len});
        } else {
            for (int j = 0; j < len; j++) {
                if (got & (1 << j)) ans[l + j] = 'T';
                else ans[l + j] = 'R';
            }
            if (anchorT == -1) {
                for (int j = 0; j < len; j++) {
                    if (got & (1 << j)) {
                        anchorT = l + j;
                        break;
                    }
                }
            }
        }
    }

    if (anchorT != -1) {
        for (auto bl : uni) {
            vector<int> vc;
            vc.pb(anchorT);
            for (int j = 0; j < bl.len; j++) vc.pb(bl.l + j);

            vector<int> p = query_machine(vc);
            if (p.back() == 1) {
                for (int j = 0; j < bl.len; j++) ans[bl.l + j] = 'R';
            } else {
                for (int j = 0; j < bl.len; j++) ans[bl.l + j] = 'T';
            }
        }

        answer_type(ans);
        return;
    }

    vector<int> all;
    for (int i = 0; i < n; i++) all.pb(i);
    int totalT = query_machine(all).back();

    int m = (int)uni.size();
    vector<int> col(m, -1);
    col[0] = 0;

    for (int i = 0; i + 1 < m; i++) {
        vector<int> vc;
        for (int j = 0; j < uni[i].len; j++) vc.pb(uni[i].l + j);
        for (int j = 0; j < uni[i + 1].len; j++) vc.pb(uni[i + 1].l + j);

        vector<int> p = query_machine(vc);
        if (p.back() == uni[i].len + uni[i + 1].len) col[i + 1] = col[i];
        else col[i + 1] = col[i] ^ 1;
    }

    long long s0 = 0, s1 = 0;
    for (int i = 0; i < m; i++) {
        if (col[i] == 0) s0 += uni[i].len;
        else s1 += uni[i].len;
    }

    int toxicColor = (s0 == totalT ? 0 : 1);

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < uni[i].len; j++) {
            ans[uni[i].l + j] = (col[i] == toxicColor ? 'T' : 'R');
        }
    }

    answer_type(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...