Gornak40

Problem 8

Feb 13th, 2021 (edited)
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int int64_t
  4.  
  5. const int INF = 1e14;
  6.  
  7. struct rect {
  8.     int i1, j1, i2, j2, su;
  9.     rect() {}
  10.     rect(int _i1, int _j1, int _i2, int _j2, int _su) : i1(_i1), j1(_j1), i2(_i2), j2(_j2), su(_su) {}
  11. };
  12.  
  13. bool operator<(rect r1, rect r2) {
  14.     return r1.su < r2.su;
  15. }
  16.  
  17. int n, m;
  18. vector<vector<int>> A;
  19.  
  20. void init() {
  21.     A.assign(n, vector<int>(m));
  22. }
  23.  
  24. rect solve() {
  25.     rect ans = rect(-1, -1, -1, -1, -INF);
  26.     vector<int> arr(n);
  27.     for (int j1 = 0; j1 < m; ++j1) {
  28.         arr.assign(n, 0);
  29.         for (int j2 = j1; j2 < m; ++j2) {
  30.             for (int i = 0; i < n; ++i)
  31.                 arr[i] += A[i][j2];
  32.             pair<int, int> mi = make_pair(0, -1), ma = make_pair(0, -1);
  33.             int ps = 0;
  34.             for (int i = 0; i < n; ++i) {
  35.                 ps += arr[i];
  36.                 ma = max(ma, make_pair(ps - mi.first, i));
  37.                 ans = max(ans, rect(mi.second + 1, j1, ma.second, j2, ma.first));
  38.                 mi = min(mi, make_pair(ps, i));
  39.             }
  40.         }
  41.     }
  42.     return ans;
  43. }
  44.  
  45. signed main() {
  46.     cin >> n >> m, init();
  47.     for (int i = 0; i < n; ++i)
  48.         for (int j = 0; j < m; ++j)
  49.             cin >> A[i][j];
  50.     rect ans = solve();
  51.     cout << ans.i1 << ',' << ans.j1 << ' ' << ans.i2 << ',' << ans.j2 << ": " << ans.su << endl;
  52. }
Add Comment
Please, Sign In to add comment