Cod sursa(job #2045164)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 21 octombrie 2017 21:19:38
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.28 kb
#include <fstream>
#include <stdlib.h>
#define nm 1005
using namespace std;
fstream f1("struti.in", ios::in);
fstream f2("struti.out", ios::out);
int n, m, p, a[nm][nm], dmax[nm][nm], dmin[nm][nm], pmin[nm], umin[nm], deqmax[nm][nm], pmax[nm], umax[nm];
int minox[nm], maxox[nm], amax[nm], amin[nm];
///deqmin[j][k]=linia celui de-al k-lea cand pt min din deque pt coloana j pt secv [i-dx+1..i]
int difmin(int dy, int &nraux)
{
    int mini=160000, i, primmax=1, primmin=1, ultimmax=0, ultimmin=0;
    for(i=1; i<=m; i++) ///afli simultan min si max pt fiecare secv de lung dy, min si max pt secv cu indici [i-dy+1, i]
    {
       while((primmin<=ultimmin)&&(minox[amin[ultimmin]]>=minox[i])) ultimmin--;
       ultimmin++;
       amin[ultimmin]=i;
       if((primmin<=ultimmin)&&(amin[primmin]==i-dy)) primmin++;

       while((primmax<=ultimmax)&&(maxox[amax[ultimmax]]<=maxox[i])) ultimmax--;
       ultimmax++;
       amax[ultimmax]=i;
       if((primmax<=ultimmax)&&(amax[primmax]==i-dy)) primmax++;

       if((i>=dy)&&(primmax<=ultimmax)&&(primmin<=ultimmin)&&(mini> abs(maxox[amax[primmax]]-minox[amin[primmin]])))
            {
                mini= abs(maxox[amax[primmax]]-minox[amin[primmin]]);
                nraux=1;
            }
       else if((i>=dy)&&(primmax<=ultimmax)&&(primmin<=ultimmin)&&(mini== abs(maxox[amax[primmax]]-minox[amin[primmin]])))
       {
           nraux++;
       }
    }
    return mini;
}
int solve(int dx, int dy, int &mini, int&nr)
{
    int i, j, rezcur, nraux;
    mini=160000;
    for(i=1; i<=m; i++) {pmin[i]=1; umin[i]=0;pmax[i]=1; umax[i]=0;}
    for(i=1; i<=n; i++)
    {
        ///pt minim : dmin[j][pmin[j]] min de pe col j, de pe bucata de secv i-dx+1, i
        for(j=1; j<=m; j++)
        {
            while((pmin[j]<=umin[j])&&(a[dmin[j][umin[j]]][j]>= a[i][j])) umin[j]--;
            umin[j]++;
            dmin[j][umin[j]]=i;
            if((pmin[j]<=umin[j])&&(dmin[j][pmin[j]]==i-dx)) pmin[j]++;
            if(i>=dx) minox[j]=a[dmin[j][pmin[j]]][j];
        }
        ///pt maxim
        for(j=1; j<=m; j++)
        {
            while((pmax[j]<=umax[j])&&(a[dmax[j][umax[j]]][j]<= a[i][j])) umax[j]--;
            umax[j]++;
            dmax[j][umax[j]]=i;
            if((pmax[j]<=umax[j])&&(dmax[j][pmax[j]]==i-dx)) pmax[j]++;
            if(i>=dx) maxox[j]=a[dmax[j][pmax[j]]][j];
        }
        if(i>=dx)
        {
            nraux=0;
            rezcur=difmin(dy, nraux);
            if(rezcur< mini) {mini=rezcur;nr=nraux;}
            else if(rezcur==mini) nr+=nraux;
        }
    }
    return mini;
}
void citire()
{
    int i, j, dx, dy, mini1, mini2, nr1, nr2;
    f1>>n>>m>>p;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            f1>>a[i][j];
    for(i=1; i<=p; i++)
    {
        f1>>dx>>dy;
        if(dx!=dy)
        {
            nr1=nr2=0;
         solve(dx, dy, mini1, nr1);
         solve(dy, dx, mini2, nr2);
         if(mini1< mini2) f2<<mini1<<' '<<nr1<<"\n";
         else if(mini1==mini2) f2<<mini1<<' '<<nr1+nr2<<"\n";
              else f2<<mini2<<' '<<nr2<<"\n";
        }
        else
        {
            nr1=0;
          solve(dx, dy, mini1, nr1);
          f2<<mini1<<' '<<nr1<<"\n";
        }
    }
}
int main()
{
    citire();
    return 0;
}