8
DisjointSet(int size) {10
parent.resize(size, 0);12
for (int i = 0; i < size; i++) parent[i] = i;16
parent[x] = find(parent[x]);20
bool merge(int x, int y) {23
if (gX == gY) return false;24
if (rank[gX] > rank[gY])26
else if (rank[gX] < rank[gY])35
for (int i = 0; i < n; i++) {43
vector<vector<int>> matrixRankTransform(vector<vector<int>> &matrix) {44
int m = matrix.size();45
int n = matrix[0].size();46
vector<vector<int>> answer(m, vector<int>(n, 1));48
// mp:(sorted) value to positions49
map<int, vector<pair<int, int>>> mp;50
for (int i = 0; i < m; ++i) {51
for (int j = 0; j < n; ++j) {52
mp[matrix[i][j]].push_back(make_pair(i, j));56
vector<int> rowMax(m, 0);57
vector<int> colMax(n, 0);58
DisjointSet *disjointSet = new DisjointSet(m + n);59
vector<vector<pair<int, int>>> group2positions(m + n);60
for (auto &element : mp) {62
group2positions.clear();63
group2positions.resize(m + n);65
// grouping positions with the same value by col and row66
for (auto &[x, y] : element.second) {67
disjointSet->merge(x, m + y);69
// allocating the grouping results70
for (auto &[x, y] : element.second) {71
group2positions[disjointSet->find(x)].push_back(make_pair(x, y));74
// for each group, assign the ranking75
for (auto &group : group2positions) {77
// rank should be the max among members in group78
for (auto &[x, y] : group) {79
rank = max(rank, max(rowMax[x], colMax[y]) + 1);81
// update the answer and max rank in row and col82
for (auto &[x, y] : group) {