Mai intai trebuie sa te autentifici.
Cod sursa(job #365655)
Utilizator | Data | 19 noiembrie 2009 15:55:39 | |
---|---|---|---|
Problema | Struti | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.94 kb |
#include <stdio.h>
#include <string.h>
#define Nmax 1003
#define INF 8000010
int T[Nmax][Nmax], A[Nmax][Nmax], B[Nmax][Nmax], MIN[Nmax][Nmax], MAX[Nmax][Nmax];
int d[Nmax], D[Nmax];
int i, j, p, u, P, U, n, m, t, DX, DY, sol, Nsol, aux;
inline void dequeOriz(int L, int k) {
int i;
p = 1, u = 0; P = 1, U = 0;
for (i = 1; i <= m; i++) {
while (p <= u && T[L][i] <= T[L][d[u]]) u--;
while (P <= U && T[L][i] >= T[L][D[U]]) U--;
d[++u] = i, D[++U] = i;
if (d[p] == i - k) p++;
if (D[P] == i - k) P++;
if (i >= k) {
A[L][i] = T[L][d[p]];
B[L][i] = T[L][D[P]];
}
}
}
inline void dequeVert(int C, int k) {
int i;
p = 1, u = 0; P = 1, U = 0;
for (i = 1; i <= n; i++) {
while (p <= u && A[i][C] <= A[d[u]][C]) u--;
while (P <= U && B[i][C] >= B[D[U]][C]) U--;
d[++u] = i, D[++U] = i;
if (d[p] == i - k) p++;
if (D[P] == i - k) P++;
if (i >= k) {
MIN[i][C] = A[d[p]][C];
MAX[i][C] = B[D[P]][C];
}
}
}
void solve() {
int i, j;
for (i = 1; i <= n; i++) {
// memset(d, 0, sizeof(d));
// memset(D, 0, sizeof(D));
dequeOriz(i, DY);
}
for (j = 1; j <= m; j++) {
// memset(d, 0, sizeof(d));
// memset(D, 0, sizeof(D));
dequeVert(j, DX);
}
for (i = DX; i <= n; i++)
for (j = DY; j <= m; j++)
if (MAX[i][j] - MIN[i][j] < sol) {
sol = MAX[i][j] - MIN[i][j];
Nsol = 1;
}
else
if (MAX[i][j] - MIN[i][j] == sol)
Nsol++;
}
int main() {
FILE *f = fopen("struti.in", "r");
FILE *g = fopen("struti.out", "w");
fscanf(f, "%d %d %d", &n, &m, &t);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
fscanf(f, "%d", &T[i][j]);
for (; t > 0; t--) {
fscanf(f, "%d %d", &DX, &DY);
sol = INF, Nsol = 0;
solve();
if (DX != DY) {
aux = DX, DX = DY, DY = aux;
solve();
}
fprintf(g, "%d %d\n", sol, Nsol);
}
fclose(f);
fclose(g);
return 0;
}