Enunț
Gigel are o grădina sub forma unei matrice binare de ordin N
, unde 0
reprezintă teren liber, 1
reprezintă pomi. El dorește să construiască un hambar pe dreptunghiul de arie maximă format doar din 0
.
Cerința
Ajutați-l pe Gigel să găsească dreptunghiul de arie maximă format doar din 0
.
Date de intrare
Fișierul de intrare hambar.in
conține pe prima linie numerele N
și M
, reprezentând dimensinunea matricei, respectiv numărul de pomi, iar pe următoarele M
linii se vor găsi perechi numere x
și y
, separate printr-un spațiu, reprezentând indicele liniei, respectiv al coloanei pe care se află un pom.
Date de ieșire
Fișierul de ieșire hambar.out
va conține pe prima linie numărul S
, reprezentând aria maximă a unei suprafețe dreptunghiulare ce nu conține 1
.
Restricții și precizări
1 ≤ N, M ≤ 1000
- Nu se vor afla
2
sau mai mulți pomi în același loc.
Exemplu
hambar.in
5 5 1 3 2 1 2 5 5 1 5 5
hambar.out
12
#include <bits/stdc++.h> using namespace std; ifstream fin("hambar.in"); ofstream fout("hambar.out"); const int MaxN = 1001; int h[MaxN][MaxN]; bool a[MaxN][MaxN]; int m, n; int maxAreaInHist(int x[], int L) { stack<int> st; int j = 0, tp; int amax = 0, area; while (j < n) { if (st.empty() || x[st.top()] <= x[j]) st.push(j++); else { tp = st.top(); st.pop(); area = x[tp] * (st.empty() ? j : j - st.top() - 1); amax = max(amax, area); } } while (!st.empty()) { tp = st.top(); st.pop(); area = x[tp] * (st.empty() ? j : j - st.top() - 1); amax = max(amax, area); } return amax; } int main() { // citire fin >> m >> n; for (int i = 0; i < n; ++i) { int x1, y1; fin >> x1 >> y1; a[x1-1][y1-1]=1; } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) a[i][j]=!a[i][j]; int maxArea = 0; for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) if (a[i][j] == 0) h[i][j] = 0; else { if ( i == 0 ) h[i][j] = 1; else h[i][j] = h[i - 1][j] + 1; } int area; for (int i = 0; i < m; i++) { area = maxAreaInHist(h[i], i); if (area > maxArea) maxArea = area; } fout << maxArea; }