Cod sursa(job #2067725)

Utilizator copanelTudor Roman copanel Data 16 noiembrie 2017 19:50:29
Problema Struti Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#define tatal <iostream>
#define fiul <fstream>
#define sfantulduh <deque>
#define amin <utility>

#include tatal
#include fiul
#include sfantulduh
#include amin
#include <cassert>

using namespace std;

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

deque<int> dmin, dmax;

inline void gencol(int k) {
    k--;
    for (int j = 0; j < n; j++) {
		dmin.clear();
		dmax.clear();
        for (int i = 0; i < m; i++) {
			if (!dmin.empty() && dmin.front() == i - k - 1)
				dmin.pop_front();
			if (!dmax.empty() && dmax.front() == i - k - 1)
				dmax.pop_front();
			while (!dmin.empty() && a[i][j] <= a[dmin.back()][j])
				dmin.pop_back();
			dmin.push_back(i);
			while (!dmax.empty() && a[i][j] >= a[dmax.back()][j])
				dmax.pop_back();
			dmax.push_back(i);
			if (i >= k) {
				colmin[i][j] = a[dmin.front()][j];
				colmax[i][j] = a[dmax.front()][j];
			}
        }
    }
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++)
				cout << colmin[i][j] << " ";
		cout << "\n";
	}
	cout << "\n";
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++)
				cout << colmax[i][j] << " ";
		cout << "\n";
	}
	cout << "\n";
}

inline pair<int, int> gendeque(short dx, short dy) {
	int 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);
			assert(!dmin.empty() && !dmax.empty());
			delta = colmax[lin][dmax.front()] - colmin[lin][dmin.front()];
			if (col >= dx - 1 && delta < mindelta) {
				mindelta = delta;
				count = 1;
			} else if (col >= dx - 1 && delta == mindelta) {
				count++;
			}
		}
	}

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

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

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

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

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

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

    fin >> m >> n >> p;
    for (int i = 0; i < m; i++) {
        for (int 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;
}