제출 #1208115

#제출 시각아이디문제언어결과실행 시간메모리
1208115omsincoconutVision Program (IOI19_vision)C++17
100 / 100
16 ms2912 KiB
#include "vision.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> bit_circuit(vector<int> row) {
    int n = row.size();
    vector<int> ret;
    for (int bit = 0; (1<<bit) < n; bit++) {
        vector<int> all_pair;
        for (int i = 0; i+(1<<bit) < n; i++) {
            vector<int> all_can;
            for (int j = i+1; j < n; j++) {
                if ((j-i)&(1<<bit)) all_can.push_back(row[j]);
            }
            all_pair.push_back(add_and({row[i], add_or(all_can)}));
        }
        ret.push_back(add_or(all_pair));
    }

    return ret;
}

void construct_network(int H, int W, int K) {
    vector<int> row(H), col(W);

    for (int i = 0; i < H; i++) {
        vector<int> inp(W);
        for (int j = 0; j < W; j++) inp[j] = i*W + j;
        row[i] = add_or(inp);
    }

    for (int j = 0; j < W; j++) {
        vector<int> inp(H);
        for (int i = 0; i < H; i++) inp[i] = i*W + j;
        col[j] = add_or(inp);
    }

    vector<int> row_bit = bit_circuit(row);
    vector<int> col_bit = bit_circuit(col);

    if (row_bit.size() < col_bit.size()) swap(row_bit, col_bit);

    vector<int> carry = {-1};
    vector<int> value;

    for (int i = 0; i < max(row_bit.size(), col_bit.size()); i++) {
        if (i < col_bit.size()) {
            int value_node, carry_node;
            if (carry.back() != -1) {
                value_node = add_xor({row_bit[i], col_bit[i], carry[i]});
                carry_node = add_or({add_and({row_bit[i], col_bit[i]}), add_and({row_bit[i], carry[i]}), add_and({col_bit[i], carry[i]})});
            }
            else {
                value_node = add_xor({row_bit[i], col_bit[i]});
                carry_node = add_and({row_bit[i], col_bit[i]});
            }

            value.push_back(value_node);
            carry.push_back(carry_node);
        } else {
            int value_node, carry_node;
            if (carry.back() != -1) {
                value_node = add_xor({row_bit[i], carry[i]});
                carry_node = add_and({row_bit[i], carry[i]});
            } else {
                value_node = row_bit[i];
                carry_node = -1;
            }

            value.push_back(value_node);
            carry.push_back(carry_node);
        }
    }
    if (carry.back() != -1)value.push_back(carry.back());

    vector<int> bit_match;
    for (int i = 0; i < value.size(); i++) {
        if ((K>>i)&1) bit_match.push_back(value[i]);
        else bit_match.push_back(add_not(value[i]));
    }

    int final_answer = add_and(bit_match);
}

// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
#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...