Cod sursa(job #1984852)

Utilizator giotoPopescu Ioan gioto Data 26 mai 2017 11:59:49
Problema Balans Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <deque>
using namespace std;

int n, m, r, c, np, mp;
long long a[302][302], d[302][302], v[602];
deque <long long> dq;
inline bool ver(long long mij){
    for(int i = 1; i <= n ; ++i){
        for(int i1 = i + r - 1; i1 <= i + n - 1 ; ++i1){
            for(int j = 1; j <= mp ; ++j)
                v[j] = v[j - 1] + d[i1][j] - d[i - 1][j];
            dq.clear();
            for(int j = c; j <= mp ; ++j){
                while(!dq.empty() && v[dq.back()] > v[j - c])
                    dq.pop_back();
                dq.push_back(j - c);
                if(v[j] - v[dq.front()] >= 0) return 1;
                if(dq.front() <= j - m) dq.pop_front();

            }
        }
    }
    return 0;
}
int main()
{
    freopen("balans.in", "r", stdin);
    freopen("balans.out", "w", stdout);
    scanf("%d%d%d%d", &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];
            a[i][j + m] = a[i][j];
            a[i + n][j + m] = a[i][j];
        }
    }
    long long st = 1, dr = 67108864;
    np = n << 1, mp = m << 1;
    while(st <= dr){
        long long mij = (st + dr) >> 1;
        for(int i = 1; i <= np ; ++i)
            for(int j = 1; j <= mp ; ++j)
                d[i][j] = d[i - 1][j] + a[i][j] - mij;
        if(ver(mij) == 0) dr = mij - 1;
        else st = mij + 1;

    }
    printf("%0.3f", (double)dr / 1000.0);
    return 0;
}