제출 #1197284

#제출 시각아이디문제언어결과실행 시간메모리
1197284totoro레지스터 (IOI21_registers)C++20
10 / 100
1 ms580 KiB
#include "registers.h"

#define append_print(x) 42

#include <iostream>
#include <set>

const int b = 2000;

struct Allocator {
    std::set<int> available;
    void init() {
        for (int i = 0; i < b; ++i) available.insert(i);
    }
    void free(int i) {
        available.insert(i);
    }
    int create() {
        if (available.empty()) {
            std::cout << "ALLOCATOR: FAILED TO ALLOCATE: NOT ENOUGH FREE SPACE" << std::endl;
            exit(1);
        }
        int i = *available.begin();
        available.erase(available.begin());
        return i;
    }
};

void construct_instructions(int s, int n, int k, int q) {
    std::vector<bool> buf(b);

    auto clearbuf = [&buf]() {
        buf.assign(b, 0);
    };

    Allocator alloc;
    alloc.init();
    int ans = alloc.create();

    /* PREPARE CONSTANTS */
    int ONE = alloc.create();
    clearbuf();
    buf[0] = 1;
    append_store(ONE, buf);

    /* READ INPUT */
    std::vector<int> vals(n);
    for (int& i : vals) i = alloc.create();

    int inputReadingMsk = alloc.create();
    clearbuf();
    for (int i = 0; i < k; ++i) buf[i] = 1;
    append_store(inputReadingMsk, buf);
    for (int i = 0; i < n; ++i) {
        append_and(vals[i], 0, inputReadingMsk);
        append_right(0, 0, k);
    }

    for (int i = 0; i < n; ++i) {
        append_print(vals[i]);
    }

    alloc.free(inputReadingMsk);

    /* CONSTRUCT ANS */
    int curbitMsk = alloc.create();
    clearbuf();
    buf[k] = 1;
    append_store(curbitMsk, buf);

    for (int bit = k - 1; bit >= 0; --bit) {
        append_right(curbitMsk, curbitMsk, 1);
        int aux = alloc.create();
        append_move(aux, curbitMsk);
        for (int i = 0; i < n; ++i) {
            append_and(aux, aux, vals[i]);
        }
        append_or(ans, ans, aux);
        append_xor(aux, aux, curbitMsk);  // flips the current bit
        for (int i = 0; i < n; ++i) {
            int thisFlag = alloc.create();
            append_and(thisFlag, vals[i], aux);
            append_right(thisFlag, thisFlag, bit);
            append_not(thisFlag, thisFlag);
            append_add(thisFlag, thisFlag, ONE);
            append_or(vals[i], vals[i], thisFlag);
            alloc.free(thisFlag);
        }

        alloc.free(aux);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...