Cod sursa(job #1841854)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 6 ianuarie 2017 09:29:25
Problema Balans Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#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;
}