제출 #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...