#include using namespace std; vector< vector< int > > create_max_table(vector< int > rows, vector< int > cols) { int n = rows.size(); int m = cols.size(); vector< vector< int > > table = vector< vector< int > >(n, vector< int >(m)); int max_row = max_element(rows.begin(), rows.end()) - rows.begin(); int max_col = max_element(cols.begin(), cols.end()) - cols.begin(); if (rows[max_row] != cols[max_col]) { return {{}}; } table[max_row][max_col] = rows[max_row]; for (int i = 0; i < n; i++) { if (i != max_row) { table[i][max_col] = rows[i]; } } for (int j = 0; j < m; j++) { if (j != max_col) { table[max_row][j] = cols[j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (table[i][j] == 0) { table[i][j] = min(rows[i], cols[j]); } } } return table; } vector< vector< int > > create_max_table_min_values(vector< int > rows, vector< int > cols) { int n = rows.size(); int m = cols.size(); vector< vector< int > > table = vector< vector< int > >(n, vector< int >(m)); int max_row = max_element(rows.begin(), rows.end()) - rows.begin(); int max_col = max_element(cols.begin(), cols.end()) - cols.begin(); if (rows[max_row] != cols[max_col]) { return {{}}; } table[max_row][max_col] = rows[max_row]; set< pair< int, int > > col_set; for (int j = 0; j < m; j++) { if (j != max_col) { table[max_row][j] = cols[j]; col_set.insert({cols[j], j}); } } for (int i = 0; i < n; i++) { if (i != max_row) { auto it = col_set.lower_bound({rows[i], 0}); if (it == col_set.end() || it->first != rows[i]) { table[i][max_col] = rows[i]; } else { int j = it->second; table[i][j] = rows[i]; table[max_row][j] = 0; col_set.erase(it); } } } return table; } bool check(vector< vector< int > > table, vector < int > rows, vector< int > cols) { int n = table.size(); if (n == 0) { return false; } int m = table[0].size(); if (n != rows.size()) { return false; } if (m != cols.size()) { return false; } for (int i = 0; i < n; i++) { if (*max_element(table[i].begin(), table[i].end()) != rows[i]) { return false; } } for (int j = 0; j < m; j++) { int max_val = 0; for (int i = 0; i < n; i++) { max_val = max(max_val, table[i][j]); } if (max_val != cols[j]) { return false; } } return true; } void print(vector< vector< int > > table) { for (auto row : table) { for (int x : row) { cout << x << " "; } cout << endl; } } int main() { vector< int > rows = {2, 10, 3, 4}; vector< int > cols = {2, 4, 4, 10, 7}; auto table = create_max_table(rows, cols); auto table_min = create_max_table_min_values(rows, cols); print(table); printf("check : %d\n", check(table, rows, cols)); print(table_min); printf("check : %d\n", check(table_min, rows, cols)); }