View difference between Paste ID: 7BYW4ykg and 2a88XXz4
SHOW: | | - or go back to the newest paste.
1
#include <bits/stdc++.h>
2
#define all(x) (x).begin(),(x).end()
3
4
using namespace std;
5
6
const int MSIZE = 1000001;
7
struct DSU {
8
    vector<int> p, d;
9
    DSU(int n) {
10
        p.assign(n, 0);
11
        d.assign(n, 1);
12
        iota(all(p), 0);
13
    }
14
    int get(int v) {
15
        if (p[v] == v) return v;
16
        return p[v] = get(p[v]);
17
    }
18
    void uni(int a, int b) {
19
        a = get(a);
20
        b = get(b);
21
        if (a == b) return;
22
        if (d[a] < d[b]) swap(a, b);
23
        d[a] += d[b];
24
        p[b] = a;
25
    }
26
};
27
28
int arr[1000][1000];
29
30
__inline__ int get(int x, int y) {
31
    return x * 1000 + y;
32
}
33
34
int main() {
35
    ios_base::sync_with_stdio(false);
36
    cin.tie(nullptr);
37
    int n, m;
38
    cin >> n >> m;
39
    for (int i = 0; i < n; i++) {
40
        for (int j = 0; j < m; j++) {
41
            cin >> arr[i][j];
42
        }
43
    }
44
    DSU dsu(MSIZE);
45
    map<pair<int,int>, vector<pair<int,int> > > mp; // X -> Y {(indXi, indYi)}
46
    bool allEqual = true;
47
    // compress
48
    for (int i = 0; i < n; i++) {
49
        for (int j = 0; j < m; j++) {
50
            allEqual &= arr[i][j] == arr[0][0];
51
            if (i && arr[i - 1][j] == arr[i][j]) {
52
                dsu.uni(get(i - 1, j), get(i, j));
53
            }
54
            if (j && arr[i][j - 1] == arr[i][j]) {
55
                dsu.uni(get(i, j - 1), get(i, j));
56
            }
57
        }
58
    }
59
    // build graph
60
    for (int i = 0; i < n; i++) {
61
        for (int j = 0; j < m; j++) {
62
            if (i && arr[i - 1][j] != arr[i][j]) {
63
                int x = arr[i -  1][j];
64
                int y = arr[i][j];
65
                if (x > y) swap(x, y);
66
            	mp[{x, y}].push_back({dsu.get(get(i - 1, j)), dsu.get(get(i, j))});
67
            }
68
            if (j && arr[i][j - 1] != arr[i][j]) {
69
                int x = arr[i][j - 1];
70
                int y = arr[i][j];
71
                if (x > y) swap(x, y);
72
                mp[{x, y}].push_back({dsu.get(get(i, j - 1)), dsu.get(get(i, j))});
73
            }
74
        }
75
    }
76
    for (auto& [key, v] : mp) {
77
        sort(all(v));
78
        v.erase(unique(all(v)), v.end());
79
        v.shrink_to_fit();
80
    }
81
    int ans = 0;
82
    pair<int,int> XY;
83
    DSU dsu2(MSIZE);
84
    for (int i = 0; i < MSIZE; i++) {
85
        dsu2.d[i] = dsu.d[i];
86
    }
87
    for (auto& [xy, st] : mp) {
88
        int curAns = 0;
89
        for (auto& [i, j] : st) {
90
            dsu2.uni(i, j);
91
            curAns = max(curAns, dsu2.d[dsu2.get(i)]);
92
        }
93
        if (ans < curAns) {
94
            ans = curAns;
95
            XY = xy;
96
        }
97
        for (auto& [i, j] : st) {
98
            dsu2.p[i] = i;
99
            dsu2.d[i] = dsu.d[i];
100
            dsu2.p[j] = j;
101
            dsu2.d[j] = dsu.d[j];
102
        }
103
    }
104
    if (allEqual) {
105
        cout << n * m << endl;
106-
        cout << arr[0][0]    << " " << arr[0][0] << endl;
106+
        cout << arr[0][0] << " " << arr[0][0] << endl;
107
    } else {
108
        cout << ans << endl;
109
        cout << XY.first << " " << XY.second << endl;
110
    }
111
}