Cod sursa(job #1572059)

Utilizator Master011Dragos Martac Master011 Data 18 ianuarie 2016 18:45:11
Problema Balans Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<cstdio>
using namespace std;

const int nMax = 153;
int mat[nMax * 2][nMax * 2],  dq[nMax * 2];
long long sumPart[nMax * 2];
int n, m, r, q, st, dr;

bool verif(int x){
    int i, j, p, k, s;
    for(i = 1 ; i <= 2 * n ; ++i){

        for(j = 1 ; j <= 2 * m ; ++j){
            sumPart[j] = 0;
        }

        for(j = i ; j <= 2 * n && j < i + n ; ++j){

            for(p = 1, s = 0; p <= 2 * m ; ++p){
                s += (mat[j][p] - x);
                sumPart[p] += s;
            }

            if(j >= i + r - 1){

                st = 1; dr = 0;
                for(p = q, k = 0; p <= 2 * m ; ++p, ++k){

                    while(st <= dr && sumPart[dq[dr]] >= sumPart[k])
                        --dr;
                    dq[++dr] = k;

                    if(st <= dr && dq[st] < p - m)
                        ++st;
                    if(sumPart[p] - sumPart[dq[st]] >= 0)
                        return 1;
                }
            }
        }
    }
    return 0;
}

int main (){
    FILE *in = fopen("balans.in","r");
    FILE *out = fopen("balans.out","w");

    fscanf(in,"%d%d%d%d", &n, &m, &r, &q);

    int i, j;
    for(i = 1 ; i <= n ; ++i){
        for(j = 1 ; j <= m ; ++j){
            fscanf(in,"%d", &mat[i][j]);
            mat[i][j] *= 1000;
            mat[i + n][j] = mat[i][j];
            mat[i][j + m] = mat[i][j];
            mat[i + n][j + m] = mat[i][j];
        }
    }

    int pas, rez = 0;
    for(pas = 1 << 25 ; pas ; pas >>= 1){
        if(verif(rez + pas))
            rez += pas;
    }

    fprintf(out,"%.3lf\n", (double)rez / 1000);
    return 0;
}