Din cauza blestemelor dușmanilor, asupra plantației de ‘noledge a vrăjitorului Arpsod s-a năpustit o ploaie de…meteoriți. Plantația vrăjitorului e foarte bine delimitată: aceasta are forma unei matrice cu N linii și M coloane, iar în fiecare celulă era plantat câte un fir de ‘noledge. Din motive clare de răzbunare, dușmanii nu s-au mulțumit cu o singură ploaie, astfel, pe plantația vrăjitorului au căzut meteoriți în mai multe reprize. La fiecare repriză, pe fiecare celulă a unui dreptunghi bine delimitat, au căzut exact C meteoriți. După ce ploaia s-a oprit, pe fiecare celulă se afla un “bloc” de piatră de înălțime egală cu numărul meteoriților căzuți în acea celulă. Arpsod, foarte furios, a luat următoarea decizie: va construi un laborator exact peste meteoriții căzuți, de unde își va pedepsi dușmanii. El a hotărât că cel mai bun amplasament pentru acest laborator este la înălțime maximă. Totodată, el își dorește ca laboratorul lui să aibă o suprafață cât mai mare.
Cerința
Deoarece Arpsod şi arhitectul său, Ierdnac, sunt prea ocupaţi să pregătească schița viitorului laborator, vă roagă pe voi să determinați aria maximă a unei suprafețe cu celule învecinate, de înălțime maximă precum și numărul de fire de ‘noledge rămase neatinse după căderea meteoriților ( poate au ratat vreunu’ ! ).
Date de intrare
Pe prima linie a fișierului meteoriti.in se află trei numere naturale separate prin spațiu: N și M, reprezentând dimensiunile plantației și R, reprezentând numărul de reprize de meteoriți. Pe următoarele R linii se vor afla cinci valori separate prin spațiu: r1 c1 r2 c2 C, unde r1 c1 reprezintă coordonatele colțului stânga sus ( linie coloană ) iar r2 c2 coordonatele colțului dreapta jos ( linie coloană ) ale dreptiunghiului pe care vor cădea meteoriți iar C reprezintă numărul de meteoriți ce vor cădea pe fiecare celulă din cele delimitate.
Date de ieșire
În fișierul meteoriti.out se va scrie, pe o singură linie, separate prin spațiu, aria maximă a unei suprafețe de înălțime maximă, formată numai din celule vecine respectiv numărul de fire de ‘noledge neafectate de meteoriți.
Restricții și precizări
4 ≤ N, M ≤ 2.0001 ≤ R ≤ 100.0001 ≤ r1 ≤ r2 ≤ N1 ≤ c1 ≤ c2 ≤ M1 ≤ C ≤ 20.000- Două celule se consideră vecine dacă au cel puțin o latură comună.
- Înălțimea inițială a celulelor se consideră
0. - Se garantează că pentru
30%din teste4 ≤ N, M ≤ 300și1 ≤ R ≤ 300 - Pentru rezolvarea corectă a primei cerinţe se acordă
80%din punctajul pe testul respectiv iar pentru rezolvarea corectă a celei de-a doua cerinţe se acordă20%din punctajul pe testul respectiv - Fișierul de ieșire TREBUIE să conțină exact DOUĂ valori chiar dacă doriți să rezolvați o singură cerință din cele două
- Dacă îi veți da răspunsul corect vrăjitorului, acesta vă va primi și pe voi prin laboratorul său.
- NU este bine să îl supărați pe vrăjitor!
Exemplu
meteoriti.in
5 6 7 2 2 4 3 1 4 4 4 6 2 1 5 4 6 1 2 5 3 6 1 2 3 4 3 1 5 1 5 3 3 4 2 4 2 1
meteoriti.out
3 12
Explicație
Matricea după meteoriţi:
0 0 0 0 1 1
0 1 2 0 2 2
0 1 2 0 2 2
0 2 2 2 3 3
3 3 3 0 0 0
Înălțimea maximă este 3 iar aria maximă a unei suprafețe de înălțime 3, este tot 3 (căsuțele îngroșate)
#include <bits/stdc++.h>
using namespace std;
ifstream cin("meteoriti.in");
ofstream cout("meteoriti.out");
int n , m , nr , x1 , x2 , y1 , y2 , add , maxi , cnt;
int a[2002][2002], numar;
struct poz{int i , j;};
bool inside(int i , int j)
{
return (i>=1 && i<=n && j>=1 && j<=m);
}
int x, y;
inline void Fill()
{
if (!inside(x, y))return;
if (a[x][y] != maxi)return;
a[x][y] = -1;
numar ++;
x ++;Fill();x --;
y ++;Fill();y--;
x --;Fill();x ++;
y --;Fill();y ++;
}
int main()
{
cin >> n >> m >> nr;
for (int i = 1; i <= nr; i ++)
{
cin >> x1 >> y1 >> x2 >> y2 >> add;
a[x1][y1] += add;
a[x1][y2 + 1] -= add;
a[x2 + 1][y1] -= add;
a[x2 + 1][y2 + 1] += add;
}
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
a[i][j] = a[i][j] + a[i-1][j] + a[i][j-1] - a[i-1][j-1];
int mx = 0;
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= m ; ++j)
{
if(a[i][j] > maxi) maxi = a[i][j];
if(a[i][j] == 0) cnt++;
}
}
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
if(a[i][j] == maxi)
{
numar = 0;
x = i; y = j;
Fill();
mx = max(numar, mx);
}
cout << mx << " " << cnt;
return 0;
}