Cod sursa(job #1219157)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 13 august 2014 16:25:42
Problema Struti Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;

int t[1005][1005];
int mint[1005][1005];
int maxt[1005][1005];

deque<int> dqmin;
deque<int> dqmax;

int m, n, p, x, y, minh = 8000, nr;

void rez(int x, int y) {
   for(int a = 1; a <= m; ++a) {
      dqmin.clear();
      dqmax.clear();
      for(int b = 1; b <= n; ++b) {
         while(!dqmin.empty() && t[a][dqmin.back()] > t[a][b]) dqmin.pop_back();
         dqmin.push_back(b);
         if(b - dqmin.front() == x) dqmin.pop_front();
         while(!dqmax.empty() && t[a][dqmax.back()] < t[a][b]) dqmax.pop_back();
         dqmax.push_back(b);
         if(b - dqmax.front() == x) dqmax.pop_front();
         if(b >= x) mint[a][b - x + 1] = t[a][dqmin.front()], maxt[a][b - x + 1] = t[a][dqmax.front()];
      }
   }
   for(int b = 1; b <= n - x + 1; ++b) {
      dqmin.clear();
      dqmax.clear();
      for(int a = 1; a <= m; ++a) {
         while(!dqmin.empty() && mint[dqmin.back()][b] > mint[a][b]) dqmin.pop_back();
         dqmin.push_back(a);
         if(a - dqmin.front() == y) dqmin.pop_front();
         while(!dqmax.empty() && maxt[dqmax.back()][b] < maxt[a][b]) dqmax.pop_back();
         dqmax.push_back(a);
         if(b - dqmax.front() == y) dqmax.pop_front();
         if(a >= y) {
            if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] < minh) {
               minh = maxt[dqmax.front()][b] - mint[dqmin.front()][b];
               nr = 1;
            }
            else if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] == minh) ++nr;
         }
      }
   }
}

void brut(int x, int y) {
   for(int i = 1; i + x - 1<= m; ++i)
      for(int j = 1; j + y - 1 <= n; ++j) {
         int mic = 8000, mare = 0;
         for(int a = i; a <= i + x - 1; ++a)
            for(int b = j; b <= j + y - 1; ++b) {
               if(t[a][b] > mare) mare = t[a][b];
               if(t[a][b] < mic) mic = t[a][b];
            }
         if(mare - mic < minh) {
            minh = mare - mic;
            nr = 1;
         }
         else if(mare - mic == minh) ++nr;
      }
}

int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");

    cin >> m >> n >> p;
    for(int i = 1; i <= m; ++i)
      for(int j = 1; j <= n; ++j)
         cin >> t[i][j];

    for(int i = 1; i <= p; ++i) {
      cin >> x >> y;
      nr = 0, minh = 8000;
      if(x == y) brut(x, y);
      else {
      rez(x, y);
      if(x != y)
         rez(y, x);
      }
      cout << minh << ' ' << nr << '\n';
    }
    return 0;
}