Facebook
From nh, 4 Months ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 212
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector< vector< int > > create_max_table(vector< int > rows, vector< int > cols) {
  6.  int n = rows.size();
  7.  int m = cols.size();
  8.  vector< vector< int > > table = vector< vector< int > >(n, vector< int >(m));
  9.  int max_row = max_element(rows.begin(), rows.end()) - rows.begin();
  10.  int max_col = max_element(cols.begin(), cols.end()) - cols.begin();
  11.  if (rows[max_row] != cols[max_col]) {
  12.   return {{}};
  13.  }
  14.  
  15.  table[max_row][max_col] = rows[max_row];
  16.  
  17.  for (int i = 0; i < n; i++) {
  18.   if (i != max_row) {
  19.    table[i][max_col] = rows[i];
  20.   }
  21.  }
  22.  
  23.  for (int j = 0; j < m; j++) {
  24.   if (j != max_col) {
  25.    table[max_row][j] = cols[j];
  26.   }
  27.  }
  28.  
  29.  for (int i = 0; i < n; i++) {
  30.   for (int j = 0; j < m; j++) {
  31.    if (table[i][j] == 0) {
  32.     table[i][j] = min(rows[i], cols[j]);
  33.    }
  34.   }
  35.  }
  36.  
  37.  return table;
  38. }
  39.  
  40. vector< vector< int > > create_max_table_min_values(vector< int > rows, vector< int > cols) {
  41.  int n = rows.size();
  42.  int m = cols.size();
  43.  vector< vector< int > > table = vector< vector< int > >(n, vector< int >(m));
  44.  int max_row = max_element(rows.begin(), rows.end()) - rows.begin();
  45.  int max_col = max_element(cols.begin(), cols.end()) - cols.begin();
  46.  if (rows[max_row] != cols[max_col]) {
  47.   return {{}};
  48.  }
  49.  
  50.  table[max_row][max_col] = rows[max_row];
  51.  
  52.  set< pair< int, int > > col_set;
  53.  
  54.  for (int j = 0; j < m; j++) {
  55.   if (j != max_col) {
  56.    table[max_row][j] = cols[j];
  57.    col_set.insert({cols[j], j});
  58.   }
  59.  }
  60.  
  61.  for (int i = 0; i < n; i++) {
  62.   if (i != max_row) {
  63.    auto it = col_set.lower_bound({rows[i], 0});
  64.  
  65.    if (it == col_set.end() || it->first != rows[i]) {
  66.     table[i][max_col] = rows[i];
  67.    } else {
  68.     int j = it->second;
  69.     table[i][j] = rows[i];
  70.     table[max_row][j] = 0;
  71.     col_set.erase(it);
  72.    }
  73.   }
  74.  }
  75.  
  76.  
  77.  return table;
  78. }
  79.  
  80. bool check(vector< vector< int > > table, vector < int > rows, vector< int > cols) {
  81.  int n = table.size();
  82.  if (n == 0) {
  83.   return false;
  84.  }
  85.  int m = table[0].size();
  86.  if (n != rows.size()) {
  87.   return false;
  88.  }
  89.  
  90.  if (m != cols.size()) {
  91.   return false;
  92.  }
  93.  
  94.  for (int i = 0; i < n; i++) {
  95.   if (*max_element(table[i].begin(), table[i].end()) != rows[i]) {
  96.    return false;
  97.   }
  98.  }
  99.  
  100.  for (int j = 0; j < m; j++) {
  101.   int max_val = 0;
  102.   for (int i = 0; i < n; i++) {
  103.    max_val = max(max_val, table[i][j]);
  104.   }
  105.  
  106.   if (max_val != cols[j]) {
  107.    return false;
  108.   }
  109.  }
  110.  
  111.  return true;
  112. }
  113.  
  114. void print(vector< vector< int > > table) {
  115.  for (auto row : table) {
  116.   for (int x : row) {
  117.    cout << x << " ";
  118.   }
  119.  
  120.   cout << endl;
  121.  }
  122. }
  123.  
  124. int main() {
  125.  vector< int > rows = {2, 10, 3, 4};
  126.  vector< int > cols = {2, 4, 4, 10, 7};
  127.  auto table = create_max_table(rows, cols);
  128.  auto table_min = create_max_table_min_values(rows, cols);
  129.  
  130.  print(table);
  131.  printf("check : %d\n", check(table, rows, cols));
  132.  
  133.  print(table_min);
  134.  printf("check : %d\n", check(table_min, rows, cols));
  135. }