Cod sursa(job #2395871)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 2 aprilie 2019 22:35:53
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <fstream>
#include <cstring>
#define NMAX 1000

using namespace std;

int dqmin[NMAX], dqmax[NMAX], mat[NMAX + 1][NMAX + 1];
int minim[NMAX + 1][NMAX + 1], maxim[NMAX + 1][NMAX + 1], h[NMAX + 1][NMAX + 1];
int n, m, diferenta, aparitii;

void add_deque( int dq[], int &dr, int st, int x, int i, int j, bool condition ) {
  while( dr >= st && (x >= mat[i][dq[dr]]) == condition )
    dr --;
  dq[++dr] = j;
}

void popfront_deque( int dq[], int &st, int j, int k ) {
  if( j - dq[st] == k - 1 )
    st ++;
}

void solve( int p, int q ) {
  int i, j;
  memset(minim,0,sizeof(minim));
  memset(maxim,0,sizeof(maxim));
  for( i = 1; i <= n; i ++ ) {
    int stmin = 0;
    int stmax = 0;
    int drmin = -1;
    int drmax = -1;
    for( j = 1; j <= q - 1; j ++ ) {
      add_deque(dqmin,drmin,stmin,mat[i][j],i,j,false);
      minim[i][j] = mat[i][dqmin[stmin]];
      add_deque(dqmax,drmax,stmax,mat[i][j],i,j,true);
      maxim[i][j] = mat[i][dqmax[stmax]];
    }
    for( j = q; j <= m; j ++ ) {
      add_deque(dqmin,drmin,stmin,mat[i][j],i,j,false);
      minim[i][j] = mat[i][dqmin[stmin]];
      popfront_deque(dqmin,stmin,j,q);
      add_deque(dqmax,drmax,stmax,mat[i][j],i,j,true);
      maxim[i][j] = mat[i][dqmax[stmax]];
      popfront_deque(dqmax,stmax,j,q);
    }
  }
  memset(h,0,sizeof(h));
  for( j = 1; j <= m; j ++ ) {
    int stmin = 0;
    int stmax = 0;
    int drmin = -1;
    int drmax = -1;
    for( i = 1; i <= p - 1; i ++ ) {
      while( drmin >= stmin && minim[i][j] <= minim[dqmin[drmin]][j] )
        drmin --;
      dqmin[++drmin] = i;
      h[i][j] -= minim[dqmin[stmin]][j];
      while( drmax >= stmax && maxim[i][j] >= maxim[dqmax[drmax]][j] )
        drmax --;
      dqmax[++drmax] = i;
      h[i][j] += maxim[dqmax[stmax]][j];
    }
    for( i = p; i <= n; i ++ ) {
      while( drmin >= stmin && minim[i][j] <= minim[dqmin[drmin]][j] )
        drmin --;
      dqmin[++drmin] = i;
      h[i][j] -= minim[dqmin[stmin]][j];
      if( i - dqmin[stmin] == p - 1 )
        stmin ++;
      while( drmax >= stmax && maxim[i][j] >= maxim[dqmax[drmax]][j] )
        drmax --;
      dqmax[++drmax] = i;
      h[i][j] += maxim[dqmax[stmax]][j];
      if( i - dqmax[stmax] == p - 1 )
        stmax ++;
    }
  }

  for( i = p; i <= n; i ++ )
    for( j = q; j <= m; j ++ ) {
      if( h[i][j] == diferenta )
        aparitii ++;
      else if( h[i][j] < diferenta )
        diferenta = h[i][j], aparitii = 1;
    }

}

int main() {
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    int k, p, q, i, j;
    fin>>n>>m>>k;
    for( i = 1; i <= n; i ++ )
      for( j = 1; j <= m; j ++ )
        fin>>mat[i][j];
    while( k ) {
      fin>>p>>q;
      diferenta = 8 * NMAX;
      aparitii = 0;
      solve(p,q);
      if( p != q )
        solve(q,p);
      fout<<diferenta<<" "<<aparitii<<"\n";
      k --;
    }
    return 0;
}