Cod sursa(job #2446818)

Utilizator TincaMateiTinca Matei TincaMatei Data 10 august 2019 20:25:58
Problema Struti Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 1000;

int matr[MAX_N][MAX_N];
int minmatr[MAX_N][MAX_N], maxmatr[MAX_N][MAX_N], aux1[MAX_N][MAX_N], aux2[MAX_N][MAX_N];
int *deq[MAX_N], st, dr, sign;

void insert(int* val) {
	while(dr > st && *val * sign <= *deq[dr - 1] * sign)
		--dr;
	deq[dr++] = val;
}

void slidingWindow1d(int n, int m, int k, bool minDeq, int matr[MAX_N][MAX_N], int rez[MAX_N][MAX_N]) {
	sign = -1;
	if(minDeq)
		sign = 1;
	
	for(int l = 0; l < n; ++l) {
		st = dr = 0;
		for(int c = 0; c < k - 1; ++c)
			insert(&matr[l][c]);
		for(int c = k - 1; c < m; ++c) {
			insert(&matr[l][c]);
			rez[l][c - k + 1] = *deq[st];
			if(deq[st] == &matr[l][c - k + 1])
				++st;
		}
	}
}

void slidingWindow2d(int n, int m, int dx, int dy, int matr[MAX_N][MAX_N], int &rez, int &cnt) {
	slidingWindow1d(n, m, dx, true,  matr, aux1);
	slidingWindow1d(n, m, dx, false, matr, aux2);

	m = m - dx + 1;

	for(int l = 0; l < n; ++l) {
		for(int c = 0; c < m; ++c)
			printf("%d ", aux1[l][c]);
		printf("\n");
	}

	for(int l = 0; l < n; ++l)
		for(int c = 0; c < m; ++c) {
			minmatr[c][l] = aux1[l][c];
			maxmatr[c][l] = aux2[l][c];
		}
	swap(n, m);

	slidingWindow1d(n, m, dy, true,  minmatr, aux1);
	slidingWindow1d(n, m, dy, false, maxmatr, aux2);

	m = m - dy + 1;
	for(int l = 0; l < n; ++l)
		for(int c = 0; c < m; ++c)
			if(aux2[l][c] - aux1[l][c] < rez) {
				rez = aux2[l][c] - aux1[l][c];
				cnt = 1;
			} else if(aux2[l][c] - aux1[l][c] == rez)
				++cnt;
}

void solveQuery(int n, int m, int dx, int dy, int matr[MAX_N][MAX_N], int &rez, int &cnt) {
	slidingWindow2d(n, m, dx, dy, matr, rez, cnt);
	if(dx != dy)
		slidingWindow2d(n, m, dy, dx, matr, rez, cnt);
}

int main() {
	int n, m, p, dx, dy;

	FILE *fin = fopen("struti.in", "r");

	fscanf(fin, "%d%d%d", &n, &m, &p);
	for(int l = 0; l < n; ++l)
		for(int c = 0; c < m; ++c)
			fscanf(fin, "%d", &matr[l][c]);
	FILE *fout = fopen("struti.out", "w");

	for(int i = 0; i < p; ++i) {
		int rez, cnt;
		fscanf(fin, "%d%d", &dx, &dy);
		
		rez = 8001;
		cnt = 0;

		solveQuery(n, m, dx, dy, matr, rez, cnt);
		fprintf(fout, "%d %d\n", rez, cnt);
	}

	fclose(fin);
	fclose(fout);

	return 0;
}