ivnikkk

Untitled

Nov 3rd, 2022
1,234
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. #define int long long
  6. using namespace std;
  7. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  8. struct Dsu {
  9.     vector<int> p, siz, mx;
  10.     Dsu(int n) {
  11.         p.resize(n); siz.resize(n, 1);
  12.         for (int i = 0; i < n; i++) {
  13.             p[i] = i;
  14.         }
  15.     }
  16.     int find(int v) {
  17.         if (v == p[v]) {
  18.             return v;
  19.         }
  20.         return p[v] = find(p[v]);
  21.     }
  22.     void merge(int a, int b) {
  23.         a = find(a), b = find(b);
  24.         if (a == b) {
  25.             return;
  26.         }
  27.         if (siz[a] < siz[b]) {
  28.             swap(a, b);
  29.         }
  30.         p[b] = a;
  31.         siz[a] += siz[b];
  32.     }
  33. };
  34. signed main() {
  35. #ifdef _DEBUG
  36.     freopen("input.txt", "r", stdin);
  37.     freopen("output.txt", "w", stdout);
  38. #endif
  39.     ios_base::sync_with_stdio(false);
  40.     cin.tie(nullptr);
  41.     int n, m; cin >> n >> m;
  42.     vector<vector<int>> a(n, vector<int>(m));
  43.     for (int i = 0; i < n; i++) {
  44.         for (int j = 0; j < m; j++) {
  45.             cin >> a[i][j];
  46.         }
  47.     }
  48.     Dsu U(n * m);
  49.     for (int i = 0; i < n; i++) {
  50.         unordered_map<int, int> lst;
  51.         for (int j = 0; j < m; j++) {
  52.             int pos = i * m + j;
  53.             if (lst.find(a[i][j]) != lst.end()) {
  54.                 U.merge(lst[a[i][j]], pos);
  55.             }
  56.             lst[a[i][j]] = pos;
  57.         }
  58.     }
  59.     for (int j = 0; j < m; j++) {
  60.         unordered_map<int, int> lst;
  61.         for (int i = 0; i < n; i++) {
  62.             int pos = i * m + j;
  63.             if (lst.find(a[i][j]) != lst.end()) {
  64.                 U.merge(lst[a[i][j]], pos);
  65.             }
  66.             lst[a[i][j]] = pos;
  67.         }
  68.     }
  69.     vector<int> pw(n * m);
  70.     vector<vector<int>> gr(n * m);
  71.     for (int i = 0; i < n; i++) {
  72.         vector<pair<int, int>> nw;
  73.         for (int j = 0; j < m; j++) {
  74.             int pos = i * m + j;
  75.             nw.push_back({ a[i][j], pos });
  76.         }
  77.         sort(all(nw));
  78.         for (int j = 0; j + 1 < m; j++) {
  79.             if (nw[j].first == nw[j + 1].first) { continue; }
  80.             int a = U.find(nw[j].second), b = U.find(nw[j + 1].second);
  81.             gr[a].push_back(b);
  82.             pw[b]++;
  83.         }
  84.     }
  85.     for (int j = 0; j < m; j++) {
  86.         vector<pair<int, int>> nw;
  87.         for (int i = 0; i < n; i++) {
  88.             int pos = i * m + j;
  89.             nw.push_back({ a[i][j], pos });
  90.         }
  91.         sort(all(nw));
  92.         for (int i = 0; i + 1 < n; i++) {
  93.             if (nw[i].first == nw[i + 1].first) { continue; }
  94.             int a = U.find(nw[i].second), b = U.find(nw[i + 1].second);
  95.             gr[a].push_back(b);
  96.             pw[b]++;
  97.         }
  98.     }
  99.     vector<bool> used(n * m, false);
  100.     vector<int> res(n * m);
  101.     queue<int> q;
  102.     for (int i = 0; i < n * m; i++) {
  103.         if (!pw[U.find(i)] && !used[U.find(i)]) {
  104.             int x = U.find(i);
  105.             q.push(x);
  106.             used[x] = true;
  107.             res[x] = 1;
  108.         }
  109.     }
  110.     while (!q.empty()) {
  111.         int v = q.front();
  112.         q.pop();
  113.         for (int& u : gr[v]) {
  114.             res[u] = max(res[v] + 1, res[u]);
  115.             pw[u]--;
  116.             if (!pw[u]) {
  117.                 q.push(u);
  118.             }
  119.         }
  120.     }
  121.     for (int i = 0; i < n; i++) {
  122.         for (int j = 0; j < m; j++) {
  123.             int pos = U.find(i * m + j);
  124.             cout << res[pos] << ' ';
  125.         }
  126.         cout << '\n';
  127.     }
  128. }
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment