- #include <bits/stdc++.h>
- 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));
- }