Submission #1214896

#TimeUsernameProblemLanguageResultExecution timeMemory
1214896countlessRaisins (IOI09_raisins)C++20
20 / 100
1 ms328 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

#define sp <<" "<<
#define endl "\n"

vector<vector<ll>> grid, pref;

ll query(int lr, int rr, int lc, int rc) {
    return { 0
        + pref[rr][rc]
        - (lr > 0 ? pref[lr-1][rc] : 0)
        - (lc > 0 ? pref[rr][lc-1] : 0)
        + (lr > 0 and lc > 0 ? pref[lr-1][lc-1] : 0)
    };
}

ll decomp(int lr, int rr, int lc, int rc) {
    ll res = query(lr, rr, lc, rc);
    ll sz = (rr - lr + 1) * (rc - lc + 1);

    if (sz < 2) return 0;

    if (sz > 2) {
        ll mn = LLONG_MAX;
        int lr1, rr1, lc1, rc1, lr2, rr2, lc2, rc2;

        for (int i = lr; i < rr; i++) {
            ll q1 = query(lr, i, lc, rc), q2 = query(i+1, rr, lc, rc);
            ll diff = abs(q1 - q2);

            if (diff < mn) {
                mn = diff;
                lr1 = lr, rr1 = i, lc1 = lc, rc1 = rc;
                lr2 = i+1, rr2 = rr, lc2 = lc, rc2 = rc;
            }
        }

        for (int i = lc; i < rc; i++) {
            ll q1 = query(lr, rr, lc, i), q2 = query(lr, rr, i+1, rc);
            ll diff = abs(q1 - q2);

            if (diff < mn) {
                mn = diff;
                lr1 = lr, rr1 = rr, lc1 = lc, rc1 = i;
                lr2 = lr, rr2 = rr, lc2 = i+1, rc2 = rc;
            }
        }

        res += decomp(lr1, rr1, lc1, rc1);
        res += decomp(lr2, rr2, lc2, rc2);
    }

    return res;
}

void solve() {
    int n, m; cin >> n >> m;
    grid.assign(n, vector<ll>(m));
    pref.assign(n, vector<ll>(m));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }

    pref = grid;
    for (int i = 1; i < n; i++) pref[i][0] += pref[i-1][0];
    for (int i = 1; i < m; i++) pref[0][i] += pref[0][i-1];

    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; j++) {
            pref[i][j] += pref[i-1][j] + pref[i][j-1] - pref[i-1][j-1];
        }
    }

    cout << decomp(0, n-1, 0, m-1) << endl;
}

signed main() {
    cin.tie(0);
    ios_base::sync_with_stdio(false);

    int t = 1;
    // cin >> t;
    while (t--)
        solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...