/*
QUESTION 14: D.E. Shaw OA — Removing Two Columns for Best Minimum Row Score
Problem Statement:
You are given a matrix with N rows and M columns.
You must delete exactly two columns.
After deletion, each row gets a score equal to the maximum value remaining in that row.
Your goal is to maximize the minimum score among all rows.
Return the largest possible minimum row score.
Hard Constraints:
1 <= N
3 <= M
N * M <= 200000
1 <= matrix[i][j] <= 1e9
Example:
matrix =
[
[8, 1, 5, 4],
[3, 7, 2, 6],
[9, 4, 1, 3]
]
Expected Output:
7
Explanation:
Remove columns 3 and 4.
Remaining:
row 1 -> max(8, 1) = 8
row 2 -> max(3, 7) = 7
row 3 -> max(9, 4) = 9
Minimum row score = 7
Brute Force:
Try every pair of columns to remove.
For each pair, scan all rows and compute the maximum remaining value.
Time Complexity:
O(M^2 * N * M)
Optimized Approach:
Binary search the answer X.
For every row, find columns where value >= X.
Cases:
- 0 good columns: impossible
- 1 good column: that column must stay
- 2 good columns: those two cannot both be removed
- 3 or more good columns: row is always safe
Check whether there exists a pair of columns that can be removed.
Time Complexity:
O(N * M * log V)
Space Complexity:
O(N + M)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool can(vector<vector<int>>& matrix, int target) {
int n = matrix.size();
int m = matrix[0].size();
vector<int> mustKeep(m, 0);
set<pair<int, int>> forbiddenPairs;
for (int i = 0; i < n; i++) {
vector<int> good;
for (int j = 0; j < m; j++) {
if (matrix[i][j] >= target) {
good.push_back(j);
}
}
if (good.empty()) return false;
if (good.size() == 1) {
mustKeep[good[0]] = 1;
} else if (good.size() == 2) {
int a = good[0];
int b = good[1];
if (a > b) swap(a, b);
forbiddenPairs.insert({a, b});
}
}
vector<int> removable;
for (int j = 0; j < m; j++) {
if (!mustKeep[j]) {
removable.push_back(j);
}
}
long long c = removable.size();
if (c < 2) return false;
long long totalPairs = c * (c - 1) / 2;
long long badPairs = 0;
for (auto [a, b] : forbiddenPairs) {
if (!mustKeep[a] && !mustKeep[b]) {
badPairs++;
}
}
return totalPairs > badPairs;
}
int maximizeMinimumRowValue(vector<vector<int>>& matrix) {
int low = 0;
int high = 1000000000;
int ans = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (can(matrix, mid)) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
return ans;
}
};
int main() {
Solution sol;
vector<vector<int>> matrix = {
{8, 1, 5, 4},
{3, 7, 2, 6},
{9, 4, 1, 3}
};
cout << sol.maximizeMinimumRowValue(matrix) << endl;
return 0;
}
LyoKUVVFU1RJT04gMTQ6IEQuRS4gU2hhdyBPQSDigJQgUmVtb3ZpbmcgVHdvIENvbHVtbnMgZm9yIEJlc3QgTWluaW11bSBSb3cgU2NvcmUKClByb2JsZW0gU3RhdGVtZW50OgpZb3UgYXJlIGdpdmVuIGEgbWF0cml4IHdpdGggTiByb3dzIGFuZCBNIGNvbHVtbnMuCgpZb3UgbXVzdCBkZWxldGUgZXhhY3RseSB0d28gY29sdW1ucy4KCkFmdGVyIGRlbGV0aW9uLCBlYWNoIHJvdyBnZXRzIGEgc2NvcmUgZXF1YWwgdG8gdGhlIG1heGltdW0gdmFsdWUgcmVtYWluaW5nIGluIHRoYXQgcm93LgoKWW91ciBnb2FsIGlzIHRvIG1heGltaXplIHRoZSBtaW5pbXVtIHNjb3JlIGFtb25nIGFsbCByb3dzLgoKUmV0dXJuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG1pbmltdW0gcm93IHNjb3JlLgoKSGFyZCBDb25zdHJhaW50czoKMSA8PSBOCjMgPD0gTQpOICogTSA8PSAyMDAwMDAKMSA8PSBtYXRyaXhbaV1bal0gPD0gMWU5CgpFeGFtcGxlOgptYXRyaXggPQpbCiAgWzgsIDEsIDUsIDRdLAogIFszLCA3LCAyLCA2XSwKICBbOSwgNCwgMSwgM10KXQoKRXhwZWN0ZWQgT3V0cHV0Ogo3CgpFeHBsYW5hdGlvbjoKUmVtb3ZlIGNvbHVtbnMgMyBhbmQgNC4KClJlbWFpbmluZzoKcm93IDEgLT4gbWF4KDgsIDEpID0gOApyb3cgMiAtPiBtYXgoMywgNykgPSA3CnJvdyAzIC0+IG1heCg5LCA0KSA9IDkKCk1pbmltdW0gcm93IHNjb3JlID0gNwoKQnJ1dGUgRm9yY2U6ClRyeSBldmVyeSBwYWlyIG9mIGNvbHVtbnMgdG8gcmVtb3ZlLgpGb3IgZWFjaCBwYWlyLCBzY2FuIGFsbCByb3dzIGFuZCBjb21wdXRlIHRoZSBtYXhpbXVtIHJlbWFpbmluZyB2YWx1ZS4KClRpbWUgQ29tcGxleGl0eToKTyhNXjIgKiBOICogTSkKCk9wdGltaXplZCBBcHByb2FjaDoKQmluYXJ5IHNlYXJjaCB0aGUgYW5zd2VyIFguCgpGb3IgZXZlcnkgcm93LCBmaW5kIGNvbHVtbnMgd2hlcmUgdmFsdWUgPj0gWC4KCkNhc2VzOgotIDAgZ29vZCBjb2x1bW5zOiBpbXBvc3NpYmxlCi0gMSBnb29kIGNvbHVtbjogdGhhdCBjb2x1bW4gbXVzdCBzdGF5Ci0gMiBnb29kIGNvbHVtbnM6IHRob3NlIHR3byBjYW5ub3QgYm90aCBiZSByZW1vdmVkCi0gMyBvciBtb3JlIGdvb2QgY29sdW1uczogcm93IGlzIGFsd2F5cyBzYWZlCgpDaGVjayB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIHBhaXIgb2YgY29sdW1ucyB0aGF0IGNhbiBiZSByZW1vdmVkLgoKVGltZSBDb21wbGV4aXR5OgpPKE4gKiBNICogbG9nIFYpCgpTcGFjZSBDb21wbGV4aXR5OgpPKE4gKyBNKQoqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIGJvb2wgY2FuKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCwgaW50IHRhcmdldCkgewogICAgICAgIGludCBuID0gbWF0cml4LnNpemUoKTsKICAgICAgICBpbnQgbSA9IG1hdHJpeFswXS5zaXplKCk7CgogICAgICAgIHZlY3RvcjxpbnQ+IG11c3RLZWVwKG0sIDApOwogICAgICAgIHNldDxwYWlyPGludCwgaW50Pj4gZm9yYmlkZGVuUGFpcnM7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGdvb2Q7CgogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSA+PSB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICBnb29kLnB1c2hfYmFjayhqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGdvb2QuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgaWYgKGdvb2Quc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgICAgIG11c3RLZWVwW2dvb2RbMF1dID0gMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChnb29kLnNpemUoKSA9PSAyKSB7CiAgICAgICAgICAgICAgICBpbnQgYSA9IGdvb2RbMF07CiAgICAgICAgICAgICAgICBpbnQgYiA9IGdvb2RbMV07CgogICAgICAgICAgICAgICAgaWYgKGEgPiBiKSBzd2FwKGEsIGIpOwoKICAgICAgICAgICAgICAgIGZvcmJpZGRlblBhaXJzLmluc2VydCh7YSwgYn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2ZWN0b3I8aW50PiByZW1vdmFibGU7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgICAgIGlmICghbXVzdEtlZXBbal0pIHsKICAgICAgICAgICAgICAgIHJlbW92YWJsZS5wdXNoX2JhY2soaik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxvbmcgbG9uZyBjID0gcmVtb3ZhYmxlLnNpemUoKTsKCiAgICAgICAgaWYgKGMgPCAyKSByZXR1cm4gZmFsc2U7CgogICAgICAgIGxvbmcgbG9uZyB0b3RhbFBhaXJzID0gYyAqIChjIC0gMSkgLyAyOwogICAgICAgIGxvbmcgbG9uZyBiYWRQYWlycyA9IDA7CgogICAgICAgIGZvciAoYXV0byBbYSwgYl0gOiBmb3JiaWRkZW5QYWlycykgewogICAgICAgICAgICBpZiAoIW11c3RLZWVwW2FdICYmICFtdXN0S2VlcFtiXSkgewogICAgICAgICAgICAgICAgYmFkUGFpcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRvdGFsUGFpcnMgPiBiYWRQYWlyczsKICAgIH0KCiAgICBpbnQgbWF4aW1pemVNaW5pbXVtUm93VmFsdWUodmVjdG9yPHZlY3RvcjxpbnQ+PiYgbWF0cml4KSB7CiAgICAgICAgaW50IGxvdyA9IDA7CiAgICAgICAgaW50IGhpZ2ggPSAxMDAwMDAwMDAwOwogICAgICAgIGludCBhbnMgPSAwOwoKICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgICAgICAgaW50IG1pZCA9IGxvdyArIChoaWdoIC0gbG93KSAvIDI7CgogICAgICAgICAgICBpZiAoY2FuKG1hdHJpeCwgbWlkKSkgewogICAgICAgICAgICAgICAgYW5zID0gbWlkOwogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzb2w7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBtYXRyaXggPSB7CiAgICAgICAgezgsIDEsIDUsIDR9LAogICAgICAgIHszLCA3LCAyLCA2fSwKICAgICAgICB7OSwgNCwgMSwgM30KICAgIH07CgogICAgY291dCA8PCBzb2wubWF4aW1pemVNaW5pbXVtUm93VmFsdWUobWF0cml4KSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9