Cod sursa(job #2067133)

Utilizator copanelTudor Roman copanel Data 15 noiembrie 2017 21:31:09
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#define tatal <iostream>
#define fiul <fstream>
#define sfantulduh <deque>
#define amin <utility>

#include tatal
#include fiul
#include sfantulduh
#include amin

using namespace std;

short a[1000][1000];
short colmin[1000][1000], colmax[1000][1000];
short m, n, p;

deque<short> dmin, dmax;

void gencol(short k) {
    k--;
    for (short j = 0; j < n; j++) {
        for (short i = k; i < m; i++) {
            for (short ii = i - k; ii <= i; ii++) {
                if (ii == i - k) {
                    colmin[i][j] = a[ii][j];
                    colmax[i][j] = a[ii][j];
                }
                colmin[i][j] = min(colmin[i][j], a[ii][j]);
                colmax[i][j] = max(colmax[i][j], a[ii][j]);
            }
        }
    }
}

pair<short, int> gendeque(short dx, short dy) {
	short mindelta = 8001, delta;
	int count = 0;
	for (int lin = dy - 1; lin < m; lin++) {
		dmin.clear();
		dmax.clear();
		for (int col = 0; col < n; col++) {
			if (!dmin.empty() && dmin.front() == col - dx)
				dmin.pop_front();
			if (!dmax.empty() && dmax.front() == col - dx)
				dmax.pop_front();
			while (!dmin.empty() && colmin[lin][col] < colmin[lin][dmin.back()])
				dmin.pop_back();
			dmin.push_back(col);
			while (!dmax.empty() && colmax[lin][col] > colmax[lin][dmax.back()])
				dmax.pop_back();
			dmax.push_back(col);
			delta = colmax[lin][dmax.front()] - colmin[lin][dmin.front()];
			if (col >= dx - 1 && delta < mindelta) {
				mindelta = delta;
				count = 1;
			} else if (delta == mindelta) {
				count++;
			}
		}
	}

	return pair<short, int>(mindelta, count);
}

pair<short, int> solutiafinala(short dx, short dy) {
	pair<short, int> p1, p2;

    gencol(dy);
	p1 = gendeque(dx, dy);

	if (dx == dy) {
		return p1;
	} else {
		gencol(dx);
		p2 = gendeque(dy, dx);

		if (p1 < p2) {
			return p1;
		} else if (p1 == p2) {
			return pair<short, int>(p1.first, p1.second + p2.second);
		} else {
			return p2;
		}
	}
}

int main()
{
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    short dx, dy;
	pair<short, int> pr;

    fin >> m >> n >> p;
    for (short i = 0; i < m; i++) {
        for (short j = 0; j < n; j++)
            fin >> a[i][j];
    }

    for (; p > 0; p--) {
        fin >> dx >> dy;
        pr = solutiafinala(dx, dy);
		fout << pr.first << ' ' << pr.second << '\n';
    }
    return 0;
}