Cod sursa(job #2514566)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 26 decembrie 2019 13:53:46
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <fstream>
#include <deque>
#include <climits>

#define MMAX 1005
#define NMAX 1005
using namespace std;

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

int m, n, p;
int dx, dy;
int a[NMAX][MMAX];
int minmat[NMAX][MMAX], maxmat[NMAX][MMAX];
int difmin=INT_MAX, nr;

struct el{
    int i;
    int j;
};
deque <int> minim;
deque <int> maxim;
deque <int> test;
void citire(){
    f>>n>>m>>p;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            f>>a[i][j];
}

void adaug_in_minim(int i, int j){
    while(!minim.empty() && minim.front() == j-dy)
        minim.pop_front();
    while(!minim.empty() && a[i][minim.back()]>a[i][j])
        minim.pop_back();
    minim.push_back(j);

}
void adaug_in_minim_matnoua(int i, int j){
    while(!minim.empty() && minim.front() == i-dx)
        minim.pop_front();
    while(!minim.empty() && a[minim.back()][minmat[minim.back()][j]]>a[i][minmat[i][j]])
        minim.pop_back();
    minim.push_back(i);
}

void adaug_in_maxim_matnoua(int i, int j){
    while(!maxim.empty() &&  maxim.front() == i-dx)
        maxim.pop_front();
    while(!maxim.empty() && a[maxim.back()][maxmat[maxim.front()][j]]<a[i][maxmat[i][j]])
        maxim.pop_back();
    maxim.push_back(i);
}

void adaug_in_maxim(int i, int j){
    while(!maxim.empty() &&  maxim.front() == j-dy)
        maxim.pop_front();
    while(!maxim.empty() && a[i][maxim.back()]<a[i][j])
        maxim.pop_back();
    maxim.push_back(j);
}

void zeroz(){
    while(!minim.empty())
        minim.pop_back();
    while(!maxim.empty())
        maxim.pop_back();
    for(int i=0; i<n; i++)
        for(int j=0; j<m-dy+1; j++){
            minmat[i][j]=0;
            maxmat[i][j]=0;
    }
}
void solve(){ /// dx - linii dy - coloane

    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            adaug_in_minim(i, j);
            adaug_in_maxim(i, j);
            if(j>=dy-1){
                minmat[i][j-dy+1] = minim.front();
                maxmat[i][j-dy+1] = maxim.front();
            }
        }
        while(!minim.empty())
            minim.pop_back();
        while(!maxim.empty())
            maxim.pop_back();
    }

    for(int j=0; j<m-dy+1; j++){
        for(int i=0; i<n; i++){
            adaug_in_minim_matnoua(i, j);
            adaug_in_maxim_matnoua(i, j);
            if(i>=dx-1){
                int dif = a[maxim.front()][maxmat[maxim.front()][j]] - a[minim.front()][minmat[minim.front()][j]];
                if(dif<difmin){
                    difmin = dif;
                    nr=1;
                }
                else if(dif == difmin)
                    nr++;
            }
        }
        //g<<'\n';
        while(!minim.empty())
            minim.pop_back();
        while(!maxim.empty())
            maxim.pop_back();
    }
//    for(int i=0; i<n; i++){
//        for(int j=0; j<m-dy+1; j++){
//            g<<minmat[i][j]<<" ";
//        }
//        g<<'\n';
//    }
//    g<<'\n';g<<'\n';
//    for(int i=0; i<n; i++){
//        for(int j=0; j<m-dy+1; j++){
//            g<<maxmat[i][j]<<" ";
//        }
//        g<<'\n';
//    }
    //zeroz();
}

int main()
{
    citire();

    for(int i=0; i<p; i++){
        f>>dx>>dy;
        difmin = INT_MAX;
        nr=0;
        solve();
        int aux = dx;
        dx = dy;
        dy = aux;
        solve();
        if(dx == dy)
            nr/=2;
        g<<difmin<<" "<<nr<<'\n';
    }
    return 0;
}