Submission #1246891

#TimeUsernameProblemLanguageResultExecution timeMemory
1246891gunnsteinnVision Program (IOI19_vision)C++20
55 / 100
5 ms1092 KiB
#include <bits/stdc++.h>
#include "vision.h"

using namespace std;
using int_t = int64_t;

bool is_in_range(int_t x, int_t y, int_t h, int_t w) {
    return (0 <= x && x < h && 0 <= y && y < w);
}

void construct_network(int h, int w, int k) {
    vector<int> final_instruction;

    if (k == 1) {
        vector<int> rows(h);
        for (int_t i = 0; i < h; i++) {
            vector<int> current_instruction(w);
            for (int_t j = 0; j < w; j++) {
                current_instruction[j] = w * i + j;
            }

            rows[i] = add_or(current_instruction);
        }

        vector<int> columns(w);
        for (int_t j = 0; j < w; j++) {
            vector<int> current_instruction(h);
            for (int_t i = 0; i < h; i++) {
                current_instruction[i] = w * i + j;
            }

            columns[j] = add_or(current_instruction);
        }

        vector<int> adjacent_rows(h - 1);
        for (int_t i = 0; i < h - 1; i++) {
            adjacent_rows[i] = add_and({rows[i], rows[i + 1]});
        }

        vector<int> adjacent_columns(w - 1);
        for (int_t i = 0; i < w - 1; i++) {
            adjacent_columns[i] = add_and({columns[i], columns[i + 1]});
        }

        vector<int> adj_rows_plus_columns;
        for (int row : adjacent_rows) adj_rows_plus_columns.push_back(row);
        for (int column : adjacent_columns) adj_rows_plus_columns.push_back(column);

        int any_adjacent_on = add_or(adj_rows_plus_columns);

        int odd_rows = add_xor(rows);
        int odd_columns = add_xor(columns);

        int only_one_odd_ro_co(add_xor({odd_rows, odd_columns}));
        add_and({any_adjacent_on, only_one_odd_ro_co});
        return;
    }

    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            for (int x = 0; x <= k; x++) {
                if (is_in_range(i + x, j + (k - x), h, w)) {
                    final_instruction.push_back(add_and({w * i + j, w * (i + x) + (j + (k - x))}));
                }

                if (is_in_range(i - x, j + (k - x), h, w)) {
                    final_instruction.push_back(add_and({w * i + j, w * (i - x) + (j + (k - x))}));
                }
            }

            if (max(h, w) > 10 && min(h, w) != 1) {
                add_or(final_instruction);
                return;
            }
        }
    }

    add_or(final_instruction);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...