Pagini recente » Cod sursa (job #2188534) | Cod sursa (job #1885639) | Cod sursa (job #2031868) | Cod sursa (job #1995546) | Cod sursa (job #1841854)
#include<bits/stdc++.h>
#define eps 0.001
using namespace std;
long long n,m,r,c;
long long a[305][305],v[305],sum[305][305],st,dr,mid,sol,m1,n1;
deque<int> q;
bool ok(int val)
{
for(int i=1;i<=n;i++)
{
for(int j=(i+r-1);j<=(i+n-1);j++)
{
for(int k=1;k<=m1;k++) v[k]=v[k-1]+sum[j][k]-sum[i-1][k];
q.clear();
int d=n-c+1;
for(int k=c;k<=m1;k++)
{
while(!q.empty() && v[k-c]<=v[q.back()]) q.pop_back();
q.push_back(k-c);
while(!q.empty() && q.front()<(k-m)) q.pop_front();
if((v[k]-v[q.front()])>=0) return 1;
}
}
}
return 0;
}
int main()
{
freopen("balans.in","r",stdin);
freopen("balans.out","w",stdout);
scanf("%lld%lld%lld%lld",&n,&m,&r,&c);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%lld",&a[i][j]);
a[i][j]*=1000;
a[i+n][j]=a[i][j+m]=a[i+n][j+m]=a[i][j];
}
}
st=1;
dr=(1<<28);
n1=n<<1LL;
m1=m<<1LL;
while(st<=dr)
{
mid=st+(dr-st)/2LL;
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=m1;j++) a[i][j]-=mid;
}
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=m1;j++)
{
sum[i][j]=sum[i-1][j]+a[i][j];
}
}
if(ok(mid))
{
sol=mid;
st=mid+1;
}
else dr=mid-1;
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=m1;j++) a[i][j]+=mid;
}
}
printf("%.3lf\n",sol/1000.0);
return 0;
}