Cod sursa(job #1843479)

Utilizator BugirosRobert Bugiros Data 8 ianuarie 2017 19:24:13
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
using namespace std;

ifstream in("struti.in");
ofstream out("struti.out");

const int MAXN = 1005;

int v[MAXN][MAXN];
int n,m;

int raspoferta, nroferta;

int dequemin[MAXN], dequemax[MAXN];
int bmin[MAXN][MAXN], bmax[MAXN][MAXN];

bool cmpmin(int a, int b)
{
    return a <= b;
}

bool cmpmax(int a, int b)
{
    return a >= b;
}

void creare_matrice(int dy, int Deque[], int mat[MAXN][MAXN], bool (*cmp)(int, int))
{
    for (int i = 1;i <= n;++i)
    {
        int p = 1, q = 0;
        for (int j = 1;j <= m;++j)
        {
            while(p <= q && !cmp(v[i][Deque[q]], v[i][j]))
                  --q;
            Deque[++q] = j;
            while(Deque[p] <= j - dy)
                ++p;
            if (j >= dy)
                mat[i][j] = v[i][Deque[p]];
        }
    }
}

void actualizare_rasp(int rasp)
{
    if (rasp == raspoferta)
        ++nroferta;
    if (rasp < raspoferta)
    {
        raspoferta = rasp;
        nroferta = 1;
    }
}

void calculare_oferta(int dx, int dy)
{
    creare_matrice(dy, dequemin, bmin, &cmpmin);
    creare_matrice(dy, dequemax, bmax, &cmpmax);

    raspoferta = 1 << 29;
    for (int j = dy;j <= m;++j)
    {
        int pmin = 1, qmin = 0;
        int pmax = 1, qmax = 0;
        for (int i = 1;i <= n;++i)
        {
            while(pmin <= qmin && bmin[dequemin[qmin]][j] >= bmin[i][j])
                  --qmin;
            dequemin[++qmin] = i;
            while(dequemin[pmin] <= i - dx)
                ++pmin;

            while(pmax <= qmax && bmax[dequemax[qmax]][j] <= bmax[i][j])
                  --qmax;
            dequemax[++qmax] = i;
            while(dequemax[pmax] <= i - dx)
                ++pmax;

            if (i >= dx)
                actualizare_rasp(bmax[dequemax[pmax]][j] - bmin[dequemin[pmin]][j]);
        }
    }
}

int main()
{
    int p;
    in >> n >> m >> p;
    for (int i = 1;i <= n;++i)
        for (int j = 1;j <= m;++j)
            in >> v[i][j];

    while(p > 0)
    {
        int dx,dy;
        in >> dx >> dy;
        calculare_oferta(dx, dy);
        int rasp = raspoferta, nr = nroferta;
        if (dx != dy)
        {
            calculare_oferta(dy,dx);
            if (raspoferta < rasp)
            {
                rasp = raspoferta;
                nr = nroferta;
            }
            else if (raspoferta == rasp)
                nr += nroferta;
        }
        out << rasp << ' ' << nr << '\n';
        --p;
    }
    return 0;
}