Cod sursa(job #2040506)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 15 octombrie 2017 21:42:02
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.22 kb
#include <iostream>
#include <cstdio>
#include <deque>
#define NMAX 1005
#define MAX 0x3f3f3f

using namespace std;

int M, N, nrOferte, teren[NMAX][NMAX], dx, dy;
deque <int> qMin, qMax;
int matMin[NMAX][NMAX], matMax[NMAX][NMAX];
struct solutie
{
    int nr, minim;
} rezultat;

void readMatrix()
{
    scanf("%d%d%d", &M, &N, &nrOferte);
    for(int i=1; i<=M; ++i)
        for(int j=1; j<=N; ++j)
            scanf("%d", &teren[i][j]);
}

void solve()
{
    for(int nrVerif = 1; nrVerif <= 2; ++nrVerif)
    {
        for(int i=1; i<=M; ++i)
        {
            ///deque pe dy
            for(int j=1; j<=N; ++j)
            {
                if(!qMin.empty() && j-qMin.front() >= dy)
                    qMin.pop_front();
                if(!qMax.empty() && j-qMax.front() >= dy)
                    qMax.pop_front();

                while(!qMin.empty() && teren[i][j] <= teren[i][qMin.back()])
                    qMin.pop_back();
                while(!qMax.empty() && teren[i][j] >= teren[i][qMax.back()])
                    qMax.pop_back();

                qMin.push_back(j);
                qMax.push_back(j);

                ///adaugare in matrice de Max si Min
                matMin[i][j] = teren[i][qMin.front()];
                matMax[i][j] = teren[i][qMax.front()];
            }

            ///resetare deque-uri
            while(!qMin.empty())
                qMin.pop_back();
            while(!qMax.empty())
                qMax.pop_back();
        }

        for(int j = dy; j <= N; ++j)
        {
            for(int i = 1; i <= M; ++i)
            {
                if(!qMin.empty() && i-qMin.front() >= dx)
                    qMin.pop_front();
                if(!qMax.empty() && i-qMax.front() >= dx)
                    qMax.pop_front();

                while(!qMin.empty() && matMin[i][j] <= matMin[qMin.back()][j])
                    qMin.pop_back();
                while(!qMax.empty() && matMax[i][j] >= matMax[qMax.back()][j])
                    qMax.pop_back();

                qMin.push_back(i);
                qMax.push_back(i);

                if(i >= dx)
                {
                    if(matMax[qMax.front()][j] - matMin[qMin.front()][j] < rezultat.minim)
                    {
                        rezultat.minim = matMax[qMax.front()][j] - matMin[qMin.front()][j];
                        rezultat.nr = 1;
                    }
                    else if(matMax[qMax.front()][j] - matMin[qMin.front()][j] == rezultat.minim)
                    {
                        rezultat.nr++;
                    }
                }
            }
            while(!qMin.empty())
                qMin.pop_back();
            while(!qMax.empty())
                qMax.pop_back();
        }

        if(dx != dy)
            swap(dx, dy);
        else
            nrVerif = 8;
    }
}

int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    readMatrix();

    for(int i=1; i<=nrOferte; ++i)
    {
        scanf("%d%d", &dx, &dy);
        rezultat.nr = 0;
        rezultat.minim = 1000000;
        solve();
        printf("%d %d\n", rezultat.minim, rezultat.nr);
    }
    return 0;
}