#include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; const ll inf = 1e12 + 5; signed main() { cin.tie(0) -> sync_with_stdio(0); int n, m, q; cin >> n >> m >> q; vector<vector<int>> v(n, vector<int>(m, 0)); for(auto &a : v) { for(auto &x : a) cin >> x; } vector<int> templ; if(n <= m) { for(int i = 0; i < n; i++) { vector<vector<ll>> dp(n, vector<ll>(m, 0)); for(int j = i + 1; j < n; j++) dp[j][0] = inf; dp[i][0] = v[i][0]; for(int col = 1; col < m; col++) { ll mn = inf; for(int linie = i; linie < n; linie++) { mn = min(mn, dp[linie][col - 1]); dp[linie][col] = v[linie][col] + mn; } } vector<int> mine(n); for(int j = i; j < n; j++) mine[j] = dp[j][m - 1]; if(i == 0) { templ = mine; } else { for(int j = i + 1; j < n; j++) { if(mine[j] - templ[j] != mine[i] - templ[i]) { cout << "3\n"; return 0; } } } } cout << "2\n"; } else { vector<ll> pref_max(m, -inf); vector<ll> pref_min(m, inf); pref_max[m - 1] = 0; pref_min[m - 1] = 0; for(int i = n - 1; i >= 0; i--) { vector<ll> mxp = pref_max; vector<ll> mnp = pref_min; pref_max.assign(m, inf); pref_min.assign(m, inf); for(int r = m - 2; r > 0; r--) { ll sum = 0; for(int l = r; l > 0; l--) { sum += v[i][l]; pref_max[l] = max(mxp[r + 1] + sum, pref_max[l]); pref_min[l] = min(mnp[r + 1] + sum, pref_min[l]); } if(r == m - 2 && sum != 0) { cout << "3\n"; return 0; } } if(pref_min[1] < 0) { cout << "3\n"; return 0; } } cout << "2\n"; return 0; } } /** Anul asta nu se da centroid -- Rugaciunile mele */
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; const ll inf = 1e12 + 5; signed main() { cin.tie(0) -> sync_with_stdio(0); int n, m, q; cin >> n >> m >> q; vector<vector<int>> v(n, vector<int>(m, 0)); for(auto &a : v) { for(auto &x : a) cin >> x; } vector<int> templ; if(n <= m) { for(int i = 0; i < n; i++) { vector<vector<ll>> dp(n, vector<ll>(m, 0)); for(int j = i + 1; j < n; j++) dp[j][0] = inf; dp[i][0] = v[i][0]; for(int col = 1; col < m; col++) { ll mn = inf; for(int linie = i; linie < n; linie++) { mn = min(mn, dp[linie][col - 1]); dp[linie][col] = v[linie][col] + mn; } } vector<int> mine(n); for(int j = i; j < n; j++) mine[j] = dp[j][m - 1]; if(i == 0) { templ = mine; } else { for(int j = i + 1; j < n; j++) { if(mine[j] - templ[j] != mine[i] - templ[i]) { cout << "3\n"; return 0; } } } } cout << "2\n"; } else { vector<ll> pref_max(m, -inf); vector<ll> pref_min(m, inf); pref_max[m - 1] = 0; pref_min[m - 1] = 0; for(int i = n - 1; i >= 0; i--) { vector<ll> mxp = pref_max; vector<ll> mnp = pref_min; pref_max.assign(m, inf); pref_min.assign(m, inf); for(int r = m - 2; r > 0; r--) { ll sum = 0; for(int l = r; l > 0; l--) { sum += v[i][l]; pref_max[l] = max(mxp[r + 1] + sum, pref_max[l]); pref_min[l] = min(mnp[r + 1] + sum, pref_min[l]); } if(r == m - 2 && sum != 0) { cout << "3\n"; return 0; } } if(pref_min[1] < 0) { cout << "3\n"; return 0; } } cout << "2\n"; return 0; } } /** Anul asta nu se da centroid -- Rugaciunile mele */ |