Submission #1272527

#TimeUsernameProblemLanguageResultExecution timeMemory
1272527ttooppZemljište (COCI22_zemljiste)C++20
30 / 70
2095 ms4212 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; ll a, b; cin >> n >> m >> a >> b; vector<vector<ll>> A(n+1, vector<ll>(m+1, 0)); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ cin >> A[i][j]; } } // Prefix sum per kolom vector<vector<ll>> pref(n+1, vector<ll>(m+1, 0)); for(int j=1; j<=m; j++){ for(int i=1; i<=n; i++){ pref[i][j] = pref[i-1][j] + A[i][j]; } } auto dist = [&](ll sum){ return llabs(a - sum) + llabs(b - sum); }; ll ans = LLONG_MAX; // Enumerasi baris atas i, baris bawah x for(int i=1; i<=n; i++){ for(int x=i; x<=n; x++){ vector<ll> col(m+1, 0); for(int j=1; j<=m; j++){ col[j] = pref[x][j] - pref[i-1][j]; } // Prefix sum untuk array col ll curr = 0; set<ll> S; S.insert(0); // prefix awal for(int j=1; j<=m; j++){ curr += col[j]; // Kita butuh cari prefix p sehingga // (curr - p) dekat dengan a dan b for(ll target : {a, b, (a+b)/2}) { ll want = curr - target; auto it = S.lower_bound(want); if(it != S.end()){ ll sumRect = curr - *it; ans = min(ans, dist(sumRect)); } if(it != S.begin()){ --it; ll sumRect = curr - *it; ans = min(ans, dist(sumRect)); } } S.insert(curr); } } } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...