#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int r, s, pp, qq;
cin>>r>>s>>pp>>qq;
int p = min(pp,qq);
int q = max(pp,qq);
int ans = INT_MAX;
vector<vector<int> > arr(r+1, vector<int>(s+1));
for(int a=1; a<=r; a++)
{
for(int b=1; b<=s; b++)
{
cin>>arr[a][b];
ans = min(ans, abs(p - arr[a][b]) + abs(q - arr[a][b]));
}
}
vector<vector<int> > pref(r+1, vector<int>(s+1, 0));
for(int a=1; a<=s; a++)
{
for(int b=1; b<=r; b++)
{
pref[b][a] = pref[b-1][a] + arr[b][a];
}
}
for(int a=1; a<=r; a++)
{
for(int b=1; b<=s; b++)
{
//cout<<pref[a][b]<<" ";
}
//cout<<endl;
}
for(int a=1; a<=r; a++)
{
for(int b=a; b<=r; b++)
{
//cout<<a<<" "<<b<<endl;
int maxsum = 0, minsum = LLONG_MAX;
vector<int> temp(s+2, 0);
for(int c=1; c<=s; c++)
{
temp[c] = pref[b][c] - pref[a-1][c];
minsum = min(minsum, temp[c]);
//cout<<temp[c]<<" ";
}
vector<long long> pref1(s+1, 0);
for (int c = 1; c <= s; c++)
{
pref1[c] = pref1[c-1] + temp[c];
}
maxsum = pref1[s];
//cout<<endl;
if (maxsum >= p && minsum <= q) {
// interval overlap, we can hit [p,q]
ans = min(ans, q - p);
} else {
// take whichever extreme is closer
ans = min(ans, min(
llabs(maxsum - p) + llabs(maxsum - q),
llabs(minsum - p) + llabs(minsum - q)
));
}
}
}
cout<<ans<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |