Cod sursa(job #3178689)

Utilizator rapidu36Victor Manz rapidu36 Data 2 decembrie 2023 10:55:50
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.69 kb
#include <fstream>
#include <deque>

using namespace std;

const int N = 1000;
const int INF = 2e7;

int nl, nc, a[N][N], val_min[N][N], val_max[N][N];

ofstream out("struti.out");

void coloana_min_max(int col, int dl)
{
    deque <int> dqmax, dqmin;
    for (int i = 0; i < nl; i++)
    {
        if (!dqmax.empty() && dqmax.front() == i - dl)
        {
            dqmax.pop_front();
        }
        while (!dqmax.empty() && a[i][col] >= a[dqmax.back()][col])
        {
            dqmax.pop_back();
        }
        dqmax.push_back(i);
        if (!dqmin.empty() && dqmin.front() == i - dl)
        {
            dqmin.pop_front();
        }
        while (!dqmin.empty() && a[i][col] <= a[dqmin.back()][col])
        {
            dqmin.pop_back();
        }
        dqmin.push_back(i);
        if (i >= dl - 1)
        {
            val_max[i][col] = a[dqmax.front()][col];
            val_min[i][col] = a[dqmin.front()][col];
        }
    }
}

void constructie_min_max(int dl, int dc)
{
    for (int c = 0; c < nc; c++)
    {
        coloana_min_max(c, dl);
    }
}

void dif_numar_matrice(int dl, int dc, int &dif_min, int &nr_mat)
{
    dif_min = INF;
    nr_mat = 0;
    //out << "\ndl = " << dl << "\tdc = " << dc << "\n";
    for (int i = dl - 1; i < nl; i++)
    {
        deque <int> dqmax, dqmin;
        while (!dqmax.empty())
        {
            dqmax.pop_back();
        }
        while (!dqmin.empty())
        {
            dqmin.pop_back();
        }
        for (int j = 0; j < nc; j++)
        {
            if (!dqmax.empty() && dqmax.front() == j - dc)
            {
                dqmax.pop_front();
            }
            while (!dqmax.empty() && val_max[i][j] >= val_max[i][dqmax.back()])
            {
                dqmax.pop_back();
            }
            dqmax.push_back(j);

            if (!dqmin.empty() && dqmin.front() == j - dc)
            {
                dqmin.pop_front();
            }
            while (!dqmin.empty() && val_min[i][j] <= val_min[i][dqmin.back()])
            {
                dqmin.pop_back();
            }
            dqmin.push_back(j);
            //out << i << ", " << j << "\t max = " << val_max[i][dqmax.front()];
            //out  << "\t min = " << val_min[i][dqmin.front()] << "\n";
            if (j >= dc - 1)
            {
                int dif_c = val_max[i][dqmax.front()] - val_min[i][dqmin.front()];
                if (dif_c < dif_min)
                {
                    dif_min = dif_c;
                    nr_mat = 1;
                }
                else if (dif_c == dif_min)
                {
                    nr_mat++;
                }
            }
        }
    }
}

int main()
{
    ifstream in("struti.in");

    int nq;
    in >> nl >> nc >> nq;
    for (int i = 0; i < nl; i++)
    {
        for (int j = 0; j < nc; j++)
        {
            in >> a[i][j];
        }
    }
    for (int i = 0; i < nq; i++)
    {
        int dl, dc, nr_mat, dif_min;
        in >> dl >> dc;
        constructie_min_max(dl, dc);
        dif_numar_matrice(dl, dc, dif_min, nr_mat);
        if (dl != dc)
        {
            constructie_min_max(dc, dl);
            int nr_mat_inv, dif_min_inv;
            dif_numar_matrice(dc, dl, dif_min_inv, nr_mat_inv);
            if (dif_min_inv < dif_min)
            {
                dif_min = dif_min_inv;
                nr_mat = nr_mat_inv;
            }
            else if (dif_min_inv == dif_min)
            {
                nr_mat += nr_mat_inv;
            }
        }
        out << dif_min << " " << nr_mat << "\n";
    }
    in.close();
    out.close();
    return 0;
}